【问题标题】:PHP null coalesce + ternary operators strange behaviorPHP空合并+三元运算符奇怪的行为
【发布时间】:2018-03-12 21:17:50
【问题描述】:

在将新的 PHP7 空合并运算符与三元运算符一起使用时,我遇到了意外行为。

具体情况(伪代码):

function a()
{
    $a = 1;
    $b = 2;
    return $b ?? (false)?$a:$b;
}

var_dump(a());

结果是 int(1)。

谁能解释一下为什么?

【问题讨论】:

  • 为了我自己的理智和任何未来使用我的代码的编码人员,我总是在这样的表达式中明确使用括号。我喜欢陈述我的意图,而不是依赖优先级或其他副作用。
  • 这是一个好点,我的坏点,谢谢

标签: php ternary-operator null-coalescing-operator


【解决方案1】:
return $b ?? (false)?$a:$b; // will return 1

return $b ?? ((false)?$a:$b); // will behave as you wanted

【讨论】:

    【解决方案2】:

    检查语句return $b ?? (false)?$a:$b;

    这首先评估$b ?? (false),然后将其结果传递给? $a:$b

    $b ?? (false) 表示给出第一个not null and isset 值,在本例中为$b

    由于$b = 2是一个真值,所以上面的表达式变为:

    返回($b) ? $a : $b,它返回$a的值,即int(1)

    如果您将原始 return 语句视为:

    返回($b ?? (false)) ? $a : $b;

    我们不需要添加额外的括号,因为 ??? 之前被评估

    【讨论】:

      【解决方案3】:

      您的空格不反映 php 评估表达式的方式。请注意,?? 有一个higher precedence,而不是三元表达式。

      你得到的结果是:

      ($b ?? false) ? $a : $b;
      

      只要$b 不是null 或计算结果为false,它就是$a

      【讨论】:

        猜你喜欢
        • 2013-10-29
        • 2016-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多