Из того, что я выучил в математике:
всякий раз, когда 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
?>
Очевидно, моя блестящая математическая база не вписывается в этот контекст, и я не знаю почему?
Изменить
Мне нужно больше разъяснений о том, что происходит внутри? PHP конвертирует обе стороны в логическое значение? или это ничего не значит для сравнения?
3 ответа
«Реальной» (строгой) эквивалентностью в PHP является ===
. Если вы используете его, вам понравится свойство транзитивности, которое вы упомянули.
Но ==
не является точной эквивалентностью в PHP. Сначала используется преобразование операндов в общий тип. Как мы видим, использование false
в качестве первого операнда приводит к уменьшению второго операнда до логического значения. Однако, если вы сравниваете ссылку на строку, такого сокращения не происходит, поэтому значения рассматриваются как отличающиеся. Конечно, такой подход нарушает свойство транзитивности. Но, опять же, ===
является «реальным» знаком равенства, а не ==
.
Вы можете думать об этом как об этом, Null просто означает, что значение «неопределено». Но «0» определяет переменную как целое число, 0 - это значение! Нуль не объявляется ничем. Поэтому это неверно.
Поэтому то, что определено («0»), не может быть равно чему-то, что не определено («Ноль»).
Редактировать - обратите внимание, что некоторые языки устанавливают значение null в качестве обозначенного значения, либо 0, если оно является целым числом, false, как логическое значение и т. Д. Но другие по умолчанию не имеют значения что-либо. PHP не может по умолчанию null как целое число.
Я думаю, что ваш вопрос об этом: 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' - правда, но кажется, что это ложь
Похожие вопросы
Новые вопросы
php
PHP - это широко используемый высокоуровневый, динамический, объектно-ориентированный и интерпретируемый язык сценариев, в первую очередь предназначенный для серверной веб-разработки. Используется для вопросов о языке PHP.