Важность использования = = = вместо == в php! [дубликат]
этот вопрос уже есть ответ здесь:
- чем отличаются операторы сравнения PHP equality (== double equals) и identity (=== triple equals)? 20 ответов
сегодня только я заметил и узнал о важности использования === оператора. Вы можете увидеть это в следующем пример:
$var=0;
if ($var==false) echo "true"; else echo "false"; //prints true
$var=false;
if ($var==false) echo "true"; else echo "false"; //prints true
$var=0;
if ($var===false) echo "true"; else echo "false"; //prints false
$var=false;
if ($var===false) echo "true"; else echo "false"; //prints true
вопрос в том, есть ли какие-либо ситуации, когда важно использовать === оператор вместо того, чтобы использовать == оператор?
9 ответов
конечно, только один пример: array_search()
предупреждение
эта функция может возвращать логическое значение
FALSE
, но может также возвращать не-булевое значение, которое оценивается какFALSE
, например0
или""
. Пожалуйста, прочитайте раздел о переключатели для получения дополнительной информации. Используйте===
оператора для проверки возвращаемого значения этой функции.
в основном, если вы используете любую функцию, возвращает значение успеха, но FALSE
на отказ, вы должны проверить результат с ===
чтобы быть уверенным (иначе зачем было бы большое красное предупреждающее окно? ;))
примеры: next()
, current()
или, Как также упоминалось, строковые функции как strpos()
, stripos()
, etc.
даже substr()
хотя это не упоминается в явном виде:
возвращает извлеченную часть строки или FALSE при сбое.
но что если извлеченная часть"0"
? Он также оценивает в FALSE
, но это не ошибка.
всегда выбрать ===
над ==
кроме того, вы абсолютно уверены, что вам нужно ==
, потому что ==
не является транзитивным. И что в свою очередь важно для ваших рассуждений о коде.
рассмотрим следующий фрагмент кода
if ( $a == $b && $b == $c ) {
// [1] assert: $a == $c
}
любой сделал бы вывод из условия if, что утверждение $a == $c
верно, потому что мы так привыкли к тому, что отношение равенства является транзитивным. Но это не годится для ==
счетчика пример:
$a = "0";
$b = 0;
$c = null;
теперь подумайте о том, как часто мы делаем (иногда бессознательно) это предположение при написании кода. Что может привести к серьезным ошибкам.
на strpos()
у вас есть 0, когда строка найдена, и false, когда отсутствует. Вы должны использовать ===
чтобы проверить разницу.
на ===
is строго сравнения типа оператор, это будет не только проверить значения, но и их тип, тогда как ==
только проверяет, является ли или нет значения такие же.
рассмотрим ситуацию, когда вы сравниваете число или строку:
if (4 === 4) // same type and value
{
// true
}
но
if (4 == "4") // same value but different type
{
// true
}
и
if (4 === "4") // same value but different type
{
// false
}
так в вышеуказанных случаях, вы должны сделать разумный выбор, использовать ли == или ===
хорошим примером, где вы можете попасть в беду, является сравнение 0 и строки, fx
if (0 == 'completed') {
// evaluates as TRUE
}
строка, не начинающаяся с числа, становится 0
при преобразовании в int. Это может стать проблемой при сравнении состояния, которое может быть 0 к строке.
на ===
оператор проверяет тип, а также равенство значений.
вот почему 0 === false
не возвращает true, так как они не одного типа.
strpos ($needle,$haystack) и связанные функции вернут false, если $needle не существует в $haystack, и 0, если $needle является первым символом $haystack; и есть целый ряд подобных функций. Использование == может дать вам неправильные результаты в этом случае, поэтому вы всегда должны использовать ===. Руководство clarly определяет, где это необходимо.
недавно я сам столкнулся с этой проблемой, когда писал быстрый синтаксический анализатор запросов SQL. Короче говоря,я сравнивал цитируемые параметры с их заполнителями в углу. В принципе, следующий код привел меня к некоторым трудным временам отладки (пример, конечно, упрощен)
$var = 0; // This is supplied dynamically
$someCondition = $var == '?';
$someCondition
закончилось тем, что все время было правдой. дрожь
в основном любое нестрогое ( = = )
Если вы сравниваете две числовые строки, они сравниваются как целые числа.1
var_dump("15" == "0xF"); // TRUE
var_dump("15" === "0xF"); // FALSE
и TRUE косвенно равно FALSE 2
$a = 0;
$b = 'x';
var_dump(FALSE == $a); // TRUE
var_dump($a == $b); // TRUE
var_dump($b == TRUE); // TRUE
var_dump(FALSE === $a); // FALSE
var_dump($a === $b); // FALSE
var_dump($b === TRUE); // FALSE