在使用带有三元运算符的新PHP7 null coalesce运算符时,我遇到了意外行为。
具体情况(虚拟代码):
function a()
{
$a = 1;
$b = 2;
return $b ?? (false)?$a:$b;
}
var_dump(a());
结果是int(1)。
有人能解释我为什么吗?
答案 0 :(得分:4)
您的空格不反映php评估表达式的方式。请注意,??
的三元表达式为higher precedence。
你得到的结果是:
($b ?? false) ? $a : $b;
$a
只要$b
不是null
或评估为false
,就是{{1}}。
答案 1 :(得分:3)
检查语句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;
我们不需要添加额外的括号,因为在??
之前评估?
答案 2 :(得分:0)
return $b ?? (false)?$a:$b; // will return 1
return $b ?? ((false)?$a:$b); // will behave as you wanted