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
我在将新的 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