Сравнение разных строк в PHP с ==возвращает true
Я просто отлаживал сценарий и обнаружил, что оператор if работает не так, как я ожидал.
var_dump("6064365413078728979" == "6064365413078728452");
die();
Приведенный выше код приведет к следующему:
bool(true)
С оператором === он работает так, как ожидалось. У кого-нибудь есть какие-нибудь идеи, почему?
Я использую PHP версии 5.3.13 с установкой wamp на 64-разрядной машине с Windows.
2 answers
<?php
$a=6064365413078728979;
$b=6064365413078728452;
echo $a."<br>".$b;
//var_dump( $a==$b );
die();
?>
Когда вы запускаете это, то на вашем компьютере может быть превышено ограничение для числа, и это происходит числовое сравнение. Попробуйте сценарий выше и увидите, что значение $a, вероятно, будет отличаться от значения, которое вы указали.
Вот почему, когда оба сравниваются численно, они равны. Следовательно, используйте === как предлагали другие
Редактировать: Объяснение, основанное на совете @Axel.
Руководство по PHP объясняет
Размер поплавок зависит от платформы, хотя максимум ~1.8e308 с точностью примерно до 14 десятичных цифр является общим значением (64-разрядный формат IEEE).
И этот веб-сайт предлагает и объясняет явление переполнения, а также небольшой php-код для проверки целочисленного и плавающего диапазона вашей системы. Знакомство с ограничением на ваших серверах, скорее всего, лучше всего объяснит, почему произошел поток предложений
PHP имеет поведение сравнения свободных типов, поэтому ваши числовые строки преобразуются в целочисленные типы перед ==
нестрогим сравнением, и результат преобразования переполняется.
Это основная причина использовать ===
, когда это возможно.
Взгляните на эту страницу для получения дополнительной информации о жонглировании типами.