我在Windows 7上运行PHP 7.0.8(VC14 x64线程安全版).
echo PHP_INT_MAX;显示9223372036854775807,但这实际上似乎并不正确.根据PHP 文档,
如果PHP遇到超出整数类型边界的数字,它将被解释为浮点数.
但是当我从文档中运行代码来演示32位系统上的整数溢出时,情况并非如此.
$large_number = 2147483647;
var_dump($large_number); // expected: int(2147483647) actual: int (2147483647)
$large_number = 2147483648;
var_dump($large_number); // expected: float(2147483648) actual: int (-2147483648)
Run Code Online (Sandbox Code Playgroud)
更奇怪的是,文档中的另一个例子:
$large_number = 9223372036854775807;
var_dump($large_number); // expected: int(9223372036854775807) actual: int(-1)
$large_number = 9223372036854775808;
var_dump($large_number);
// expected: float(9.2233720368548E+18), actual: float(9.2233720368548E+18)
Run Code Online (Sandbox Code Playgroud)
这是一个错误,还是我误解了什么?我发现的唯一类似的错误var_dump(PHP_INT_MAX)与xdebug的输出不正确(我的版本中存在),但这似乎无法解释这里发生了什么.如果有人知道我应该包含的相关信息,phpinfo我可以添加它.
在@Terminus发表了有用的评论后,我尝试xdebug.overload_var_dump=0在php.ini中设置.使用该设置,var_dump生成正确的输出.我突然想到,echo $large_number;在测试过程中,我忽略了尝试,所以我overload_var_dump重新开始并echo产生了预期的结果,而var_dump没有.
$large_number = 2147483648;
echo $large_number; // 2147483648
var_dump($large_number); // int -2147483648
$large_number = 9223372036854775807;
echo $large_number; // 9223372036854775807
var_dump($large_number); // int -1
Run Code Online (Sandbox Code Playgroud)
因此,我之前发现的错误报告似乎确实解释了这一点.错误报告中的原始描述说:
var_dump()没有在64位Windows上显示有关PHP_INT_MAX和PHP_INT_MIN常量的正确信息
但似乎这是不完整的; 它实际上显示了大量变量以及常量的不正确信息.