我最近偶然发现了一个充其量似乎是一个错误的情况。在比较中使用时,两者null
和false
似乎都被评估为较低但不等于负无穷大。
我目前的测试用例:
var_dump(
PHP_OS,
PHP_VERSION,
null == 0, # true
false == 0, # true
INF==INF, # true
(-1*INF) == (-1*INF), # true
(-1*INF) < (-1*INF), # false!
(-1*INF) > (-1*INF), # false!
'Insane In The Membrane',
null == (-1*INF), # false!?
false == (-1*INF), # false!?
null < (-1*INF), # true!
false < (-1*INF) # true!
);
这是在各种PHP 版本和我可以访问的一些 Windows 机器上运行的。所有人都有惊人的相同结果。
忽略前两个调试转储,如果您是一位经验丰富的 PHP 开发人员,接下来的 6 个结果是您所期望的。前两个是由于类型杂耍,后四个是由于PHP和math。
现在最后四个是困扰我的地方。
我不确定低于负无穷大的东西在数学中是否有效。
更奇怪的是前两个和后两个比较的组合。不知何故,相同类型的杂耍算法使其有效:
var_dump(
'Insane In The Membrane (Redux)',
(null == 0) && (null < (-1*INF)), # true
(false == 0) && (false < (-1*INF)) # true
);
如果有人可以就这些类型转换如何以如此不同的方式进行评估以及为什么将不胜感激提供任何见解。
PS我一次又一次地尝试搜索SO ,PHP手册甚至PHP错误跟踪器,都无济于事。我尝试查看 C 源代码以确定使该代码以它的方式工作的点点滴滴。还是没有骰子。