使用大数字PHP时比较失败

使用大数字PHP时比较失败,php,Php,我在读一篇文章时发现了这样一个例子: // Prints bool(true) var_dump('9223372036854775807' == '9223372036854775808'); // Prints bool(false) var_dump('9223372036854775807' ==='9223372036854775808'); 有人能解释为什么吗 从PHP5.4.4开始,这不再是一个问题 之所以会发生这种情况,是因为类型杂耍。在第一个示例中,您正在检查在执行类型杂耍

我在读一篇文章时发现了这样一个例子:

// Prints bool(true)
var_dump('9223372036854775807' == '9223372036854775808');

// Prints bool(false)
var_dump('9223372036854775807' ==='9223372036854775808');
有人能解释为什么吗

从PHP5.4.4开始,这不再是一个问题

之所以会发生这种情况,是因为类型杂耍。在第一个示例中,您正在检查在执行类型杂耍后,这两个值是否相等

在另一个示例中,您正在检查这两个值是否相同,如相同类型中的值和相同的值

检查来自和a的

这里有几件事很开心

如果值的类型不同,
=
不会返回false。在本例中,PHP将字符串转换为浮点数以比较数字,由于它们的大小和PHP处理浮点数的方式,它们被舍入为相同的数字,因此将两个字符串作为相同的数字进行比较

=
强制类型必须相同。因此,将这两个字符串进行比较,它们是不同的

正如@Classified在另一条评论中提到的,这是PHP5.4.4中修复的,因此不是当前的bug

<?php
var_dump('9223372036854775807' == '9223372036854775808');
var_dump('9223372036854775807' ==='9223372036854775808');
没有。请参见上面运行的确切代码,以获取证明

更新:

根据下面的评论,询问者使用的PHP版本已经有4年历史,不再受支持,并且可能存在安全漏洞。更新你的PHP


请查看php.net上的生命终结图表

这两个案例都应该返回FALSE,因为数字不同,但我认为您的疑问在于“=”和“=”之间的区别,以及为什么第一个案例返回true-right>

当您使用“=”时,您正在比较在类型杂耍之前值是否等于;当您使用“==”时,您正在比较在类型杂耍之后值是否等于。 换句话说,当使用“=”时,您比较的是值是否等于,但当您使用“==”时,您比较的是值和类型是否等于

在这些情况下,两个比较都应该返回FALSE,因为值不同,但是关于第一个比较返回TRUE,这是PHP中的一个错误,如您在中所见:

PS:9223372036854775807是较大的整数,因此如果使用gettype()检查类型,您将看到:

9223372036854775807是一个整数

9223372036854775808是一篇的双倍

如果是在一篇文章中,我想你可以多读几行并得到答案。第二次比较比较的是两个字符串,而不是两个大数字。php版本???在php版本7.2.4、5.6.20、5.5中,它们都返回
bool(false)
,这只适用于较新版本的PHP。在5.4.4之后,这是标准,但在此之前,您将收到示例中指定的结果。@我只是在测试,因为谷歌搜索示例中的数字会得到php错误报告。我们不支持死的和可能不安全的php。请查看寿命结束图表,并向任何人建议立即升级
bool(false) 
bool(false)