【问题标题】:Does php spaceship ever return something other than -1, 0, or 1?php spaceship 是否会返回-1、0 或1 以外的值?
【发布时间】:2021-11-30 14:44:39
【问题描述】:

根据this,宇宙飞船运算符 () 返回“一个小于、等于或大于零的整数,具体取决于 $x 是否小于、等于或大于 $y” .

Trying it out,好像只返回-1、0、1。

总是这样吗?

【问题讨论】:

  • 它总是只返回 -1、0 或 1
  • NAN 的有趣结果...两个 NAN 不能相等,大于或小于但它返回 1。
  • @SalmanA 看看this answer。 “但如果 <==> 都没有返回 true,则太空飞船会感到困惑并返回 1”部分解释了自 NAN > NAN 以来的 NAN 行为, NAN < NANNAN == NAN 都返回 false。
  • @SalmanA 我想唯一的其他选择是抛出一个错误,比如除以零,因为将 NaN 传递给类似 usort() 的东西可能会导致更多的混乱。

标签: php spaceship-operator


【解决方案1】:

来自PHP's New feature's page

Spaceship operator

宇宙飞船运算符用于比较两个表达式。
它返回-101$a 分别小于、等于或大于时比$b.
比较是根据 PHP 常用的类型比较规则进行的。

所以,只有-101 可以从<=> 返回

【讨论】:

    【解决方案2】:

    current implementation 总是返回正常输入的这些值。当它比较两个数字时,它使用这个宏来规范化结果:

    #define ZEND_NORMALIZE_BOOL(n)  \
    ((n) ? (((n)<0) ? -1 : 1) : 0)
    

    (不过,它确实为扩展提供的对象提供了自己的实现,因此它们可以返回不同的值。)

    但是,the official documentation 仅保证“小于、等于或大于零的 int”。它的预期用途是在诸如 usort 之类的函数中查找这些值。

    由于这是一个常见的约定,如果您正在编写自己的代码,那么坚持这一点可能比明确检查 -1 和 1 更好。

    如果实施发生变化,或者您需要与不同的比较来源进行交互,这不太可能在未来引起意外。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 2020-05-06
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多