#php #comparison #boolean
#php #сравнение #логическое
Вопрос:
Я наткнулся на кое-что, что меня заинтриговало, и я просто хочу знать, как объяснить, почему это происходит.
$var = true;
if($var == 'X'){
echo 'pass';
}
Приведенный выше код вызовет ‘pass’… почему? Если я использую $var === 'x'
, он будет вести себя так, как ожидалось.
Спасибо.
Комментарии:
Ответ №1:
Непустая строка всегда будет оцениваться, чтобы TRUE
просмотреть документацию PHP по логическому вычислению. Как вы обнаружили, вы должны использовать ===
для строгого сравнения типов, чтобы проверить 'X'
, идентична ли строка логическому TRUE
значению .
'X' == TRUE // TRUE
'' == TRUE // FALSE
'X' === TRUE // FALSE
Комментарии:
1. 1, одна из многих ошибок слабо типизированного языка. @rocksfrow, если вы также хотите проверить тип, используйте
===
вместо этого.2. Это имеет смысл> Спасибо!
3. Это не (полная) причина. Например, в JavaScript непустая строка также вычисляется
true
как , ноtrue == 'X'
являетсяfalse
. Это зависит от того, какое преобразование типа выполняется. В общем, существует разница между вычислением и преобразованием типов. Теперь я не знаю, где определен алгоритм сравнения для PHP, но результат описан во второй таблице сравнения .4. Это просто пример, показывающий, что только потому, что что-то оценивается
true
, оно не обязательно должно бытьtrue
. Но, может быть, я просто делаю это более сложным, чем оно есть 😉 Вполне может быть, что в PHP строка преобразуется в логическое значение при сравнении с логическим значением, и в этом случае не будет разницы между значением оценки и значением преобразования типа… просто подумал, что на это стоит обратить внимание.5. Продолжайте мой предыдущий комментарий, это действительно так. Сравнение определяется здесь: php.net/manual/en/language.operators.comparison.php
Ответ №2:
Манипулирование типами PHP может иметь свои преимущества, но, на мой взгляд, это приводит к «опасным» недоразумениям. Другие примеры, которые не являются интуитивными, будут:
'abc' == 0;
0 == null;
'' == null;
1 == '1y?z'
Все это считается истинным в PHP по разным причинам. Я всегда рекомендую написать свою собственную функцию для проверки равенства, которая работает так, как вы ожидаете (или у вас в голове есть целая матрица сравнения типов PHP?);
Комментарии:
1. На самом деле приятно показать это
true == 'abc'
и'abc' == 0
ноtrue != 0
…