PHP 的空合并运算符的右结合性
Right associativity of PHP's null coalesce operator
根据 PHP 文档,空合并运算符 ??
是右结合运算符,即
$a ?? $b ?? $c
相当于
$a ?? ($b ?? $c)
这有什么意义?它是左关联还是右关联对开发人员有什么区别吗?
对于那些认为它会调用 less 函数的人来说,这是不正确的,因为根据我的测试,如果左操作数不为空,则不会计算右操作数:
function f(string $a) : string {
echo "f($a)\n";
return $a;
}
var_dump(f("a") ?? f("b") ?? f("c") ?? f("d"));
echo "===\n";
var_dump(((f("a") ?? f("b")) ?? f("c")) ?? f("d"));
输出:
f(a)
string(1) "a"
===
f(a)
string(1) "a"
What is the significance of this?
与三元运算符(左结合)相比,空合并运算符是右结合的允许堆叠。例如:
这行不通
echo isset($foo) ? $foo :
isset($bar) ? $bar :
isset($baz) ? $baz :
'default';
这就是您可能期望默认情况下来自 C 或 C++ 的三元运算符的工作方式,但您错了。新的 ??
运算符允许以下替代方法:
这行得通
echo $foo ?? $bar ?? $baz ?? 'default';
我正在考虑性能问题,如果它是左关联的,您必须多次评估 ??
(如果第一个值不为空),而如果它是右关联的则只评估一次。比较这两种情况:
(("a" ?? "b") ?? "c") ?? "d"
"a" ?? ("b" ?? ("c" ?? "d"))
第一行,解析第二个(内)括号?? "b"
后,解析第一个(外)括号?? "c"
内的值,然后最后的?? "d"
已解决。 ??
执行了3次。
在第二行,由于 "a"
不为空,因此 ("b" ?? ("c" ?? "d"))
的整个块不需要解析。 ??
只执行一次。
虽然右侧的值未解析,但检查 !== null
次可能仍然有益。
(不过,我想知道这是不是唯一的原因?)
根据 PHP 文档,空合并运算符 ??
是右结合运算符,即
$a ?? $b ?? $c
相当于
$a ?? ($b ?? $c)
这有什么意义?它是左关联还是右关联对开发人员有什么区别吗?
对于那些认为它会调用 less 函数的人来说,这是不正确的,因为根据我的测试,如果左操作数不为空,则不会计算右操作数:
function f(string $a) : string {
echo "f($a)\n";
return $a;
}
var_dump(f("a") ?? f("b") ?? f("c") ?? f("d"));
echo "===\n";
var_dump(((f("a") ?? f("b")) ?? f("c")) ?? f("d"));
输出:
f(a)
string(1) "a"
===
f(a)
string(1) "a"
What is the significance of this?
与三元运算符(左结合)相比,空合并运算符是右结合的允许堆叠。例如:
这行不通
echo isset($foo) ? $foo :
isset($bar) ? $bar :
isset($baz) ? $baz :
'default';
这就是您可能期望默认情况下来自 C 或 C++ 的三元运算符的工作方式,但您错了。新的 ??
运算符允许以下替代方法:
这行得通
echo $foo ?? $bar ?? $baz ?? 'default';
我正在考虑性能问题,如果它是左关联的,您必须多次评估 ??
(如果第一个值不为空),而如果它是右关联的则只评估一次。比较这两种情况:
(("a" ?? "b") ?? "c") ?? "d"
"a" ?? ("b" ?? ("c" ?? "d"))
第一行,解析第二个(内)括号?? "b"
后,解析第一个(外)括号?? "c"
内的值,然后最后的?? "d"
已解决。 ??
执行了3次。
在第二行,由于 "a"
不为空,因此 ("b" ?? ("c" ?? "d"))
的整个块不需要解析。 ??
只执行一次。
虽然右侧的值未解析,但检查 !== null
次可能仍然有益。
(不过,我想知道这是不是唯一的原因?)