Ответ 1
Оператор тройного равенства чувствителен к типу. Поэтому, когда вы проверяете:
if ($check === false)
... это будет только так, если $check
является логическим значением "false". Тогда как
if ($check == false)
... не проверяет специфически для boolean false, но значение "falsey". False, в PHP, равно нулю, null является "falsey", как и пустая строка ("" == false == null
, но "" !== false !== null
). Итак:
$check = 0;
if ($check == false)
... имеет значение true.
Оператор префикса !
эквивалентен ==
. Поэтому, когда нулевое значение должно быть дискретным значением из логического значения false, операторы !
и ==
не являются достаточными.
Ознакомьтесь с документами для операторов сравнения здесь: http://php.net/manual/en/language.operators.comparison.php
Лучше всего сделать ваши условные проверки максимально конкретными. Это не только для того, чтобы избежать потенциальных оплошностей в вашей логике, но и сделать код более удобным для будущих разработчиков. Представьте себе, что встречаете строку кода следующим образом:
if (check_something($variable)) {
// do stuff
}
Я могу предположить, что функция check_something
возвращает логическое значение true. Но, если я не перекопаю функцию check_something
, она может также возвращать непустую строку, число... кто знает! Гораздо понятнее сделать это:
if (check_something($variable) === true) {
// do stuff
}
Теперь, просто посмотрев, я знаю, что функция check_something
ожидается, чтобы вернуть истинное значение. Возможно, я не знаю, что делает функция, но, по крайней мере, ясно, что она возвращает. Другой распространенный пример, который вы видите ВЕЗДЕ:
if (!$_GET['value']) {
// do something
}
Это домашнее животное. Условное утверждение всегда должно четко сравнивать вещи. Итак, вы хотите сделать:
if (array_key_exists('value', $_GET) !== false && $_GET['value'] === '1') {
// do something
}
Теперь вы можете сказать, что я не только проверяю, существует ли параметр строки запроса, но также ли он равен определенному значению.
Таким образом, единственный префикс !
и оператор ==
редко бывают полезны и всегда неоднозначны. Лучше всего вам писать свой код таким образом, который сам документирует или переводится на человеческий язык, чтобы выразить логику игры. Прямое сравнение с использованием !==
или ===
, где это уместно, является хорошей привычкой, хорошей практикой и наименее вероятным результатом непредсказуемых результатов в вашем коде.