Из того, что я выучил в математике:

всякий раз, когда A = B и B = C, тогда также A = C

Так что если null == false and false == '0', then null == '0'

Давайте попробуем это в PHP

<?php

echo (false == null); // true
echo (false == '0'); // true
echo (null == '0'); // false

?>

Очевидно, моя блестящая математическая база не вписывается в этот контекст, и я не знаю почему?

< Сильный > Edit

Мне нужно больше разъяснений о том, что происходит внутри? PHP конвертирует обе стороны в логическое значение? или это ничего не значит для сравнения?

1
Rain 24 Фев 2018 в 04:12

3 ответа

Лучший ответ

«Реальной» (строгой) эквивалентностью в PHP является ===. Если вы используете его, вам понравится свойство транзитивности, которое вы упомянули.

Но == не является точной эквивалентностью в PHP. Сначала используется преобразование операндов в общий тип. Как мы видим, использование false в качестве первого операнда приводит к уменьшению второго операнда до логического значения. Однако, если вы сравниваете ссылку на строку, такого сокращения не происходит, поэтому значения рассматриваются как отличающиеся. Конечно, такой подход нарушает свойство транзитивности. Но, опять же, === является «реальным» знаком равенства, а не ==.

3
AndreyS Scherbakov 24 Фев 2018 в 01:42

Вы можете думать об этом как об этом, Null просто означает, что значение «неопределено». Но «0» определяет переменную как целое число, 0 - это значение! Нуль не объявляется ничем. Поэтому это неверно.

Поэтому то, что определено («0»), не может быть равно чему-то, что не определено («Ноль»).

Редактировать - обратите внимание, что некоторые языки устанавливают значение null в качестве обозначенного значения, либо 0, если оно является целым числом, false, как логическое значение и т. Д. Но другие по умолчанию не имеют значения что-либо. PHP не может по умолчанию null как целое число.

2
exemplarary 24 Фев 2018 в 01:33

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

Если вы попробуете это ... (обратите внимание на ТРЕЙЛ ===)

echo (false === null); // result = false
echo (false === '0'); // result = false
echo (null === '0'); // result = false

Это означает сравнение в строгом режиме, что означает сравнение значения и типа. Вы сравнивали в гибком, что не очень надежно, так как это может привести к непредсказуемым результатам, если вам не нужно быть строгим. Типичное гибкое сравнение, т.е.

$myvar = null;
if($myvar == false)  ....

Который так же, как ...

if(!$myvar) ...

Итак, если вы действительно хотите доверять сравнению типов, используйте тройное равенство ===

В любом случае, я бы поспорил, что null == '0' - правда, но кажется, что это ложь

1
Aberel 24 Фев 2018 в 01:37