PHP:比较 NULL 和 FALSE - 转换为 ~Negative Infinity

Posted

技术标签:

【中文标题】PHP:比较 NULL 和 FALSE - 转换为 ~Negative Infinity【英文标题】:PHP: Comparing NULL and FALSE - Casted to ~Negative Infinity 【发布时间】:2012-12-30 19:13:38 【问题描述】:

我最近偶然发现了一个充其量似乎是错误的情况。在比较中使用时,nullfalse 似乎都被评估为更低但不等于负无穷大。

我当前的测试用例:

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
);

如果有人能就这些类型转换如何被如此不同地评估以及为什么提供任何见解,将不胜感激。


附: I have tried 搜索 SO again 和 again 和 again,PHP Manual 甚至 PHP bug tracker,都无济于事。我尝试查看 C 源代码以确定使该代码以它的方式工作的点点滴滴。还是没有骰子。

【问题讨论】:

谁会想到; PHP 的拜占庭类型转换规则仍然导致莫名其妙的行为 ;) 我想一种解释是null 肯定不大于 比-inf,也不等于 到-inf。所以通过消除... @OliCharlesworth 呵呵,我同意它不是 equal,但为什么不是 greater 呢?它应该被评估为 0(就像我的问题的第二种情况一样)并且 be 大于-inf。我对传递给cmp 汇编指令的确切内容感到困惑。我不知道如何处理无穷大,现在我也不知道nullfalse 是如何处理的。 PHP 将数字转换为布尔值,而不是将布尔值(或此处的 null)转换为数字。看我的回答。 【参考方案1】:

我昨天刚在看这个。我们将冒险查看 PHP 手册并查看比较运算符页面:

http://php.net/manual/en/language.operators.comparison.php

那里有一张很棒的图表,它解释了比较不同类型的对象时会发生什么,这是其中的一列:

bool or null    anything    Convert to bool, FALSE < TRUE

因此,null 被强制转换为 false,任何非零数都被强制转换为 true。 Source 而且,如您所见,FALSE

【讨论】:

认为这可能很明显...谢谢您的回答:)【参考方案2】:

也许这会有所帮助:

http://gynvael.coldwind.pl/?id=492

它主要涵盖 == 运算符,但也有一些关于一般比较如何工作的信息和指针。

【讨论】:

充其量,该链接提供了关于null==0null!=(-1*INF) 的原因的见解,正如前面提到的,经验丰富的开发人员已经理解原因。问题似乎严格与 小于 运算符有关,使 nullfalse 小于 ANY NUMBER(+/- 0 除外)。

以上是关于PHP:比较 NULL 和 FALSE - 转换为 ~Negative Infinity的主要内容,如果未能解决你的问题,请参考以下文章

null undefined false 值转换的比较

php权威编程有趣部分

PHP 数组中出现中文乱码,json_encode返回结果为null 或false

PHP 获取JSON json_decode返回NULL解决办法

PHP 获取JSON json_decode返回NULL解决办法

undefined和null区别