PHP null coalesce +三元运算符奇怪的行为

时间:2017-10-01 17:02:21

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

在使用带有三元运算符的新PHP7 null coalesce运算符时,我遇到了意外行为。

具体情况(虚拟代码):

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

var_dump(a());

结果是int(1)。

有人能解释我为什么吗?

3 个答案:

答案 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