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

Он в основном охватывает оператор ==, но также содержит некоторую информацию и указатели о том, как в целом работают сравнения.

Другие вопросы по тегам