【发布时间】:2017-02-13 23:47:37
【问题描述】:
根据 PHP 文档,空合并运算符 ?? 是右关联的,即
$a ?? $b ?? $c
等价于
$a ?? ($b ?? $c)
这有什么意义?它是左关联还是右关联对开发人员有什么影响吗?
对于那些认为它会调用更少函数的人来说,这是不正确的,因为根据我的测试,如果左操作数不为空,则不会计算右操作数:
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"
【问题讨论】:
-
如果
$a、$b和$c是函数,那么如果它是左关联或右关联作为一个简单的示例,这将导致完全不同的执行。如果您在??之外使用不同的运算符,那么会发生同样的事情,具体取决于代码执行的“关联性”完全不同。 -
@Rizier123 现在可以吗? 3v4l.org/PvvSr
-
FWIW,我想不出任何左关联
??运算符与堆叠的??运算符组合会产生不同结果的情况。它似乎只与内部短路有关;即左关联??运算符将始终评估所有堆叠的表达式(即使不是它们的操作数),而不是尽快返回。不过,您可能会发现将它与其他运算符结合使用会产生不同的行为。 -
我会添加“运算符优先级和关联性指定分组,但它们没有指定执行组的顺序。” gist.github.com/nikic/6699370
标签: php operators null-coalescing-operator associativity