PHP中字符串比较的奇怪结果

Ben*_*eli 1 php string string-comparison php-5.3

今天我们遇到了一个问题,令我惊讶的是我以前从未遇到过。它与字符串比较有关:

echo ("9400110897799014514025" == "9400110897799014514018" ? "match" : "not");
echo ("94001108" == "94001107" ? "match" : "not");
Run Code Online (Sandbox Code Playgroud)

2组都不匹配,但是第一个错误地报告了“匹配”,而第二组正确地将其声明为“不是”匹配。我们通过使用'==='代替'=='解决了该问题,但我真的很想了解这里发生了什么。

添加:这是PHP 5.3

Str*_*dox 9

我尝试运行您的代码,但是notnot尝试了前几次。仅在将php版本降低到5.4.3或更低版本后,我才知道matchnot

看来您在php的过时版本上运行,并遇到了该bug。自php5.4.4起已解决。

最好的办法可能是升级您的php版本(尽管严格比较也不是一件坏事)

编辑:根据原始答案的评论,看起来问题同样在更高版本中仍然存在,但仅在32位系统上存在。

问题本身是由于php在进行比较时非常松散,将看起来像数字的字符串转换为比较之前的数字。例如,这导致php将“ 1e3”等于“ 1000”。