PHP: сравнение NULL и FALSE - приведено к отрицательной бесконечности
Недавно я наткнулся на ситуацию, которая в лучшем случае кажется ошибкой. И то и другое null
а также false
по-видимому, оценивается как меньшее, но не равное отрицательной бесконечности при использовании в сравнениях.
Мой текущий контрольный пример:
var_dump(
PHP_OS,
PHP_VERSION,
null == 0, # true
false == 0, # true
INF==INF, # true
(-1*INF) == (-1*INF), # true
(-1*INF) < (-1*INF), # false!
(-1*INF) > (-1*INF), # false!
'Insane In The Membrane',
null == (-1*INF), # false!?
false == (-1*INF), # false!?
null < (-1*INF), # true!
false < (-1*INF) # true!
);
Это выполнялось на различных версиях PHP и на некоторых машинах с Windows, к которым у меня был доступ. У всех был удивительный результат.
Игнорирование первых двух дампов отладки. Следующие 6 результатов - это то, что вы ожидаете, если вы опытный разработчик PHP. Первые два связаны с жонглированием типов, а последние четыре - с PHP и математикой.
Теперь последние четыре - вот что меня беспокоит.
Я не уверен, действительно ли в математике допустимо иметь что-то меньшее отрицательной бесконечности.
Что еще более странно, так это сочетание первых двух и двух последних сравнений. Каким-то образом алгоритм жонглирования того же типа делает это действительным:
var_dump(
'Insane In The Membrane (Redux)',
(null == 0) && (null < (-1*INF)), # true
(false == 0) && (false < (-1*INF)) # true
);
Если кто-то может дать какое-либо представление о том, как эти типы бросков оцениваются так по-разному, и почему это будет высоко оценено.
PS Я пытался снова и снова искать SO, Руководство по PHP и даже средство отслеживания ошибок PHP, но все безрезультатно. Я попытался просмотреть исходный код на языке C, чтобы определить, какие части кода заставляют этот код работать так, как он работает. Все еще нет игры в кости.
2 ответа
Я просто смотрел на это вчера. Мы рассмотрим руководство по PHP и посмотрим на страницу операторов сравнения:
http://php.net/manual/en/language.operators.comparison.php
Там есть отличная диаграмма, которая объясняет, что происходит, когда сравниваются объекты разных типов, и это один из ее столбцов:
bool or null anything Convert to bool, FALSE < TRUE
Таким образом, null преобразуется в false, а любое ненулевое число преобразуется в true. Источник И, как вы можете видеть, ЛОЖЬ <ИСТИНА. Вот почему вы получаете якобы безумное поведение - Что касается того, почему это может иметь место, это может быть из-за схожего поведения С. (Но C никогда не позволяет вам играть так быстро и свободно с системой ввода!)
Может быть, это поможет:
http://gynvael.coldwind.pl/?id=492
Он в основном охватывает оператор ==, но также содержит некоторую информацию и указатели о том, как в целом работают сравнения.