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

4

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

具体情况(虚拟代码):

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

var_dump(a());

结果为int(1)。

有人可以解释一下为什么吗?


4
为了维护自己的理智和方便未来使用我的代码的程序员,我总是在表达式中明确地使用括号。我喜欢说明我的意图,而不依赖于运算优先级或其他副作用。 - Nigel Ren
那是一个很好的观点,我的错,谢谢。 - Aldos
3个回答

6
你的空格不符合php表达式的计算方式。请注意,??优先级高于三元表达式。
你会得到以下结果:
($b ?? false) ? $a : $b;

只要$b不是null或评估为false$a就是这样的。

3
检查语句return $b ?? (false)?$a:$b; 首先评估$b ?? (false),其结果然后传递给? $a : $b; $b ?? (false)的意思是给第一个非null和isset值,在这种情况下是$b 由于$b = 2,它是一个真实的值,上面的表达式变为:
返回($b) ? $a : $b,返回$a的值,它是int(1) 如果您将原始返回语句视为以下内容,则整个过程将更容易理解:
返回($b ?? (false)) ? $a : $b; 我们不需要添加额外的括号,因为???之前被评估。

0
return $b ?? (false)?$a:$b; // will return 1

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接