Обработка логического сравнения с помощью PHP — объяснения?

#php #comparison #boolean

#php #сравнение #логическое

Вопрос:

Я наткнулся на кое-что, что меня заинтриговало, и я просто хочу знать, как объяснить, почему это происходит.

 $var = true;
if($var == 'X'){
  echo 'pass';
}
  

Приведенный выше код вызовет ‘pass’… почему? Если я использую $var === 'x' , он будет вести себя так, как ожидалось.

Спасибо.

Комментарии:

1. php.net/manual/en/language.operators.comparison.php

Ответ №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