Странные результаты для сравнения строк в PHP - PullRequest
1 голос
/ 11 июня 2019

Сегодня мы столкнулись с проблемой, с которой я удивился, с которой я не сталкивался раньше. Это было связано со сравнением строк:

echo ("9400110897799014514025" == "9400110897799014514018" ? "match" : "not");
echo ("94001108" == "94001107" ? "match" : "not");

Ни один из двух подходов не соответствует, но первый сообщает о «неверном» совпадении, а второй правильно объявляет, что «не соответствует». Мы решили проблему, используя «===» вместо «==», но мне бы очень хотелось понять, что здесь происходит.

Добавить: Это PHP 5.3

1 Ответ

9 голосов
/ 11 июня 2019

Я попытался запустить ваш код, но я получил notnot в первые несколько попыток. Только после понижения версии php до 5.4.3 или ниже я получил matchnot.

Похоже, вы работаете на устаревшей версии php и обнаружили эту ошибку . Это было решено начиная с php5.4.4.

Лучшее, что можно сделать, - это обновить версию php (хотя в любом случае строгое сравнение не так уж плохо)

Редактировать : Судя по комментариям к исходному ответу, похоже, что проблема сохраняется и в более поздних версиях, но только в 32-битных системах.

Сама проблема возникает из-за того, что php крайне неэффективен при сравнении, преобразовывая строки, которые выглядят как числа, в числа перед сравнением. Это приводит к тому, что php считает "1e3" равным, например, 1000.

...