Обработка логического сравнения с помощью PHP - объяснение? - PullRequest
1 голос
/ 03 ноября 2011

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

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

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

Спасибо.

Ответы [ 2 ]

5 голосов
/ 03 ноября 2011

Непустая строка всегда будет иметь значение TRUE См. Документация PHP по булевой оценке .Как вы обнаружили, вы должны использовать === для строгого сравнения типов, чтобы проверить, идентична ли строка 'X' логическому TRUE.

'X' == TRUE  // TRUE
'' == TRUE   // FALSE
'X' === TRUE // FALSE
1 голос
/ 03 ноября 2011

Жонглирование типов в PHP может иметь свои преимущества, но, на мой взгляд, это приводит к «опасным» недоразумениям.Другими примерами, которые не являются интуитивными, будут:

'abc' == 0;
0 == null;
'' == null;
1 == '1y?z'

Все они считаются верными в PHP по разным причинам.Я всегда рекомендую написать собственную функцию для проверки на равенство, которая работает так, как вы этого ожидаете (или у вас в голове есть вся матрица сравнения типов PHP ?);

...