решение странных логических выражений в php - PullRequest
2 голосов
/ 15 мая 2009
$foo = 0;

if($foo == 'on') $foo = 1;

echo $foo;

Следует ожидать, что вышеприведенный код выводит «0». Однако это не так, как-то $foo == 'on' приводит к TRUE, хотя это, очевидно, неправильно. Замена выражения на $foo === 'on' дает правильный ответ, поэтому любые подозрения, что это может быть какой-то проблемой при наборе текста, похоже, подтверждаются.

Тем не менее, как PHP может думать, что $foo было 'on', если $foo и 'on' даже не относятся к одному и тому же типу? Это ошибка или какая-то странная особенность?

Ответы [ 2 ]

3 голосов
/ 15 мая 2009

это документированное поведение :

Если вы сравните целое число со строкой, строка преобразуется в число. Если вы сравниваете две числовые строки, они сравниваются как целые числа. Эти правила также применяются к оператору switch.

3 голосов
/ 15 мая 2009

В php - произвольное сравнение (==) строки, а int 0 оценивается как True. Хотя строгое сравнение (===) также сравнивает для тех же типов, это означает, что оно сравнивается, если переменные стенда являются строками или целыми числами. Но это оценивается как ложное, потому что $ foo является int, а 'on' является строкой. Также смотрите таблицы сравнения на php.net: http://php.net/types.comparisons

...