在PHP中使用"=="比较不同的字符串会返回true。

3
我刚刚在调试一个脚本时发现if语句的执行结果与我的预期不一致。
var_dump("6064365413078728979" == "6064365413078728452");
die();

上面的代码将会得到以下结果:
bool(true)

使用 === 运算符时,它按预期工作。有人有任何想法吗?

我正在使用 PHP 版本 5.3.13,在 x64 Windows 机器上安装了 WAMP。


在我的PHP版本5.3.10上,你的代码返回false。 - Bastian Rang
那会返回 false。不确定你是怎么得到 true 的。 - SeanWM
这是因为非空字符串相当于true。就像比较TRUE == TRUE一样。===运算符对数据类型敏感。 - Ronald Borla
在我们进行研究的同时,您能告诉我们您服务器上的PHP_INT_MAX值是多少吗? - Áxel Costas Pena
int(2147483647) 所以你是正确的。谢谢大家的帮助。我应该将“正确”的答案改为您的答案以备将来参考吗? - Lubje
哦,没必要,Hanky正在完成他的回答。很高兴能帮忙。 - Áxel Costas Pena
2个回答

7

PHP具有松散的类型比较行为,因此在执行==非严格比较之前,您的数字字符串将被转换为整数类型,而转换结果会溢出。

这是使用===可能的主要原因。

请参阅此页面以获取有关类型转换的更多详细信息。


1
@Gordon,在你的情况下,这相当于1 == 0,但在这种情况下,整数溢出了。让我花一点时间添加一些关于PHP整数限制的信息(这取决于机器,因此其中会有一些有趣的信息)。 - Áxel Costas Pena
1
@Áxel 不仅仅是int类型受到限制,甚至浮点数也受到架构的限制。因此你的回答仍然正确。在他的情况下,这个限制可能已经被超越了。 - Hanky Panky
@HankyPanky 浮点数限制被 6064365413078728979 超出了吗?我不这么认为。无论如何,这是个好观点。 - Áxel Costas Pena
1
是的,它可以根据架构超过限制。虽然我现在不知道确切的最大值,但他可能在32位架构上,这个点以下的限制可能会受到限制。 - Hanky Panky
@Áxel 不要删除它,它提供了一个很好的解释和讨论。 - Hanky Panky
显示剩余7条评论

3
<?php
$a=6064365413078728979;
$b=6064365413078728452;
echo $a."<br>".$b;
//var_dump( $a==$b );
die();
?>

当你运行时,可能会超过数字限制,并进行数字比较。尝试上面的脚本,看看$a的值可能与您提供的值不同。这就是为什么当两者进行数字比较时它们相等的原因。因此,建议使用 === ,如其他人所建议的那样。
编辑:根据@Axel的建议解释。 PHP手册解释道:“浮点数的大小依赖于平台,尽管最大值约为1.8e308,精度大约为14个小数位数(64位IEEE格式)。” 此网站提供了有关溢出现象的解释和一个小的php代码来测试您系统的整数和浮点范围。了解服务器的限制很可能会最好地解释为什么发生了溢出。

@Lubje 看,它们两个是一样的 :) - Hanky Panky
1
@HankyPanky,你能否在你的回答中附上一些关于类型转换、字符串转换和PHP整数和浮点数限制的PHP文档链接,以便完善这个维基问题?完成后我会删除我的回答。如果你愿意这样做,我会非常高兴。 - Áxel Costas Pena
嗯...并不完全正确。我们的发现是最终没有溢出,但字符串被转换为浮点数,整数部分被降低直到两个数字在其表示中相等...你认为你能改进它吗? - Áxel Costas Pena

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接