Важность использования === вместо == в php! [дубликат]

10
задан Bakhtiyor 21 June 2010 в 12:29
поделиться

9 ответов

Конечно, только один пример: array_search ()

Предупреждение

Эта функция может возвращать логическое значение FALSE , но может также возвращать не- Логическое значение, которое принимает значение FALSE , например 0 или "" . Пожалуйста, прочтите раздел о логических значениях для получения дополнительной информации. Используйте оператор === для проверки возвращаемого значения этой функции.

Обычно, если вы используете любую функцию, которая возвращает значение в случае успеха, но FALSE при неудаче , вы должны проверить результат с помощью === , чтобы быть уверенным. (иначе зачем там большое красное окно с предупреждением?;))


Дополнительные примеры: next () , current ()
или, как уже упоминалось, строковые функции как strpos () , stripos () и т. д.

Даже substr () , хотя это не упоминается явно:

Возвращает извлеченную часть строки или FALSE при неудаче.

Но что, если извлеченная часть равна «0» ? Он также принимает значение FALSE , но это не ошибка.

13
ответ дан 3 December 2019 в 14:17
поделиться

Оператор === - это строгий оператор сравнения типов , он проверяет не только значения , но и их тип тогда как == проверяет только, совпадают ли значения .

Рассмотрим ситуацию, когда вы сравниваете числа или строки :

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
}

Таким образом, в приведенных выше случаях вы должны сделать разумный выбор, использовать ли == или ===

3
ответ дан 3 December 2019 в 14:17
поделиться

Хороший пример, когда у вас могут возникнуть проблемы, - это сравнение 0 и строки fx

if (0 == 'completed') {
  // evaluates as TRUE
}

Строка, не начинающаяся с числа, становится 0 при преобразовании в int. Это может стать проблемой при сравнении статуса, который может иметь значение 0, со строкой.

3
ответ дан 3 December 2019 в 14:17
поделиться

Недавно я сам столкнулся с этой проблемой, когда писал быстрый синтаксический анализатор SQL-запросов. Короче говоря, я сравнивал указанные параметры с их заполнителями в углу. По сути, следующий код привел меня к трудным временам отладки (пример, конечно, упрощен)

$var = 0; // This is supplied dynamically

$someCondition = $var == '?';

$ someCondition в конечном итоге всегда был верным. Shiver

Обычно любое нестрогое (==) == сравнение приводит к преобразованию строки в целое число. В зависимости от ввода это может закончиться как 0 или int-значение строки, если оно есть, даже если вся строка не является полностью числовой.

0
ответ дан 3 December 2019 в 14:17
поделиться

strpos ($ Needle, $ haystack) и связанные функции вернут false, если $ Need не существует в $ haystack, и 0, если $ Needle является первым символом $ haystack; и есть масса подобных функций. В этом случае использование == может дать неверные результаты, поэтому всегда следует использовать ===. В руководстве четко указано, где это необходимо.

1
ответ дан 3 December 2019 в 14:17
поделиться

В strpos () у вас 0, если строка найдена, и false, если отсутствует. Вы должны использовать === , чтобы проверить разницу.

6
ответ дан 3 December 2019 в 14:17
поделиться

Всегда выбирайте === вместо == , за исключением того, что вы абсолютно уверены, что вам нужен == , потому что == не является транзитивным. А это, в свою очередь, важно для ваших рассуждений о вашем коде.

Рассмотрим следующий фрагмент кода

if ( $a == $b && $b == $c ) {
    // [1] assert: $a == $c
}

Кто угодно мог бы сделать вывод из условия if, что утверждение $ a == $ c истинно, потому что мы так привыкли к транзитивности отношения равенства. Но это неверно для == , встречный пример:

$a = "0";
$b = 0;
$c = null;

Теперь подумайте о том, как часто мы делаем (иногда бессознательно) это предположение при написании кода. Это могло привести к серьезным ошибкам.

7
ответ дан 3 December 2019 в 14:17
поделиться

Оператор === проверяет тип, а также равенство значений.

Вот почему 0 === false не возвращает истину, поскольку они не одного типа.

2
ответ дан 3 December 2019 в 14:17
поделиться

Если вы сравниваете две числовые строки, они сравниваются как целые числа. 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
0
ответ дан 3 December 2019 в 14:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: