我最近偶然发现了一个似乎只是一个错误的情况。在比较中,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 Versions和某些Windows机器上运行的。所有人都有惊人的相同结果。
忽略前两个调试转储,如果您是经验丰富的PHP开发人员,接下来的6个结果就是您所期望的。前两个归因于type juggling,后两个归因于PHP和math。
现在最后四个是困扰我的。
我不确定数学中的有效是否有低于负无穷大的东西。
前两个和后两个比较的组合仍然是陌生人。不知何故,相同类型的杂耍算法使其有效:
var_dump(
'Insane In The Membrane (Redux)',
(null == 0) && (null < (-1*INF)), # true
(false == 0) && (false < (-1*INF)) # true
);
如果有人能够对如何对这些类型广播进行如此不同的评估提供任何见解,并且为什么会非常感激。
P.S。 I have tried搜索SO again和again以及again,PHP Manual甚至是PHP bug tracker,都无济于事。我试着查看C源代码来确定使代码按照它的方式工作的位和部分。仍然没有骰子。
答案 0 :(得分:2)
我昨天正在看这个。我们将尝试使用PHP手册并查看比较运算符页面:
http://php.net/manual/en/language.operators.comparison.php
有一个很棒的图表可以解释比较不同类型的对象时会发生什么,这是它的一个列:
bool or null anything Convert to bool, FALSE < TRUE
因此,null被转换为false,任何非零数字都被转换为true。 Source而且,正如您所见,FALSE&lt;真正。这就是为什么你会被认为是疯狂的行为 - 至于为什么会出现这种情况,可能是因为C的类似行为。 (但是C永远不会让你用打字系统快速松散地玩这个!)
答案 1 :(得分:1)