Конечно, только один пример: array_search ()
Предупреждение
Эта функция может возвращать логическое значение
FALSE
, но может также возвращать не- Логическое значение, которое принимает значениеFALSE
, например0
или""
. Пожалуйста, прочтите раздел о логических значениях для получения дополнительной информации. Используйте оператор===
для проверки возвращаемого значения этой функции.
Обычно, если вы используете любую функцию, которая возвращает значение в случае успеха, но FALSE
при неудаче , вы должны проверить результат с помощью ===
, чтобы быть уверенным. (иначе зачем там большое красное окно с предупреждением?;))
Дополнительные примеры: next ()
, current ()
или, как уже упоминалось, строковые функции как strpos ()
, stripos ()
и т. д.
Даже substr ()
, хотя это не упоминается явно:
Возвращает извлеченную часть строки или FALSE при неудаче.
Но что, если извлеченная часть равна «0»
? Он также принимает значение FALSE
, но это не ошибка.
Оператор ===
- это строгий оператор сравнения типов , он проверяет не только значения , но и их тип тогда как ==
проверяет только, совпадают ли значения .
Рассмотрим ситуацию, когда вы сравниваете числа или строки :
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, со строкой.
Недавно я сам столкнулся с этой проблемой, когда писал быстрый синтаксический анализатор SQL-запросов. Короче говоря, я сравнивал указанные параметры с их заполнителями в углу. По сути, следующий код привел меня к трудным временам отладки (пример, конечно, упрощен)
$var = 0; // This is supplied dynamically
$someCondition = $var == '?';
$ someCondition
в конечном итоге всегда был верным. Shiver
Обычно любое нестрогое (==)
strpos ($ Needle, $ haystack) и связанные функции вернут false, если $ Need не существует в $ haystack, и 0, если $ Needle является первым символом $ haystack; и есть масса подобных функций. В этом случае использование == может дать неверные результаты, поэтому всегда следует использовать ===. В руководстве четко указано, где это необходимо.
В strpos ()
у вас 0, если строка найдена, и false, если отсутствует. Вы должны использовать ===
, чтобы проверить разницу.
Всегда выбирайте ===
вместо ==
, за исключением того, что вы абсолютно уверены, что вам нужен ==
, потому что ==
не является транзитивным. А это, в свою очередь, важно для ваших рассуждений о вашем коде.
Рассмотрим следующий фрагмент кода
if ( $a == $b && $b == $c ) {
// [1] assert: $a == $c
}
Кто угодно мог бы сделать вывод из условия if, что утверждение $ a == $ c
истинно, потому что мы так привыкли к транзитивности отношения равенства. Но это неверно для ==
, встречный пример:
$a = "0";
$b = 0;
$c = null;
Теперь подумайте о том, как часто мы делаем (иногда бессознательно) это предположение при написании кода. Это могло привести к серьезным ошибкам.
Оператор ===
проверяет тип, а также равенство значений.
Вот почему 0 === false
не возвращает истину, поскольку они не одного типа.
Если вы сравниваете две числовые строки, они сравниваются как целые числа. 1
var_dump("15" == "0xF"); // TRUE
var_dump("15" === "0xF"); // 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