PHP 空合并 + 三元运算符奇怪的行为

PHP null coalesce + ternary operators strange behavior

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

具体情况(伪代码):

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

var_dump(a());

结果是 int(1).

谁能解释一下为什么?

您的空格未反映 php 计算表达式的方式。请注意,?? 比三元表达式具有 higher precedence

您得到以下结果:

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

只要 $b 不是 null 或计算结果为 false.

$a

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

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

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

因为 $b = 2,这是一个真实的值,上面的表达式变成:

return ($b) ? $a : $b return 的 $a 的值是 int(1)

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

,那么整件事会更有意义

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

我们不需要添加额外的括号,因为 ???

之前计算
return $b ?? (false)?$a:$b; // will return 1

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