我正在阅读一篇文章,我找到了这个例子:
// Prints bool(true)
var_dump('9223372036854775807' == '9223372036854775808');
// Prints bool(false)
var_dump('9223372036854775807' ==='9223372036854775808');
任何人都可以解释我为什么?
答案 0 :(得分:2)
这里发生了一些事情。
如果值的类型不同,则 ==
不会返回false。在这种情况下,PHP将字符串转换为浮点数以比较数字,并且由于它们的大小和PHP处理浮点数的方式,它们被舍入到相同的数字,因此将2个字符串作为数字进行比较它们是相同的。
===
强制类型必须相同。所以将这两者比作字符串就不一样了。
正如@Classified在另一条评论中提到的,这在PHP 5.4.4中得到修复,因此不是当前的错误。
答案 1 :(得分:1)
两种情况都应该返回 FALSE ,因为数字不同,但我认为你的疑问是关于' == '和' === ' AND 为什么第一个案例返回true 对吧?
当您使用' == '时,您正在比较值是否等于 BEFORE type-juggling ,当您使用' === '您在比较值是否等于 AFTER type-juggling 。 换句话说,当使用' == '时,您要比较值是否等于,但是当您使用' === 时'你在比较值和类型是否等于。
在这些情况下,两个比较都应该返回 FALSE 因为值不同,但是关于返回 TRUE 的第一个比较,这是PHP中的错误,因为你可以见:https://bugs.php.net/bug.php?id=54547
PS: 9223372036854775807 是一个更大的int数字,所以如果你用 gettype()检查类型,你会看到:
9223372036854775807 是整数。
9223372036854775808 是双。
答案 2 :(得分:-2)
从PHP 5.4.4开始,这不再是一个问题。
之所以发生这种情况,是因为类型杂耍。在第一个例子中,你要检查两个值是否相等 AFTER 类型 - 玩杂耍,这样才能有效地比较两种字符串类型。
在另一个示例中,您要检查两个值是否相同,如同相同类型和完全相同的值。
检查this.
答案 3 :(得分:-2)
<?php
var_dump('9223372036854775807' == '9223372036854775808');
var_dump('9223372036854775807' ==='9223372036854775808');
输出:
bool(false)
bool(false)
没有。请参阅上面运行的确切代码,以获取证明https://3v4l.org/4oHvo
更新:
根据以下评论,看起来这个人要求使用的是4年前不再受支持的PHP版本,并且可能容易受到安全漏洞的影响。更新你的PHP!
请参阅php.net https://secure.php.net/eol.php
上的生命周期结束图表