Согласно документации 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") ?? "d""a" ?? ("b" ?? ("c" ?? "d"))
На первой строке, после вторых (внутренних) скобок ?? "b"
разрешено, значение в первых (внешних) скобках ?? "c"
решен, то окончательный ?? "d"
решено. ??
выполняется 3 раза.
На второй линии, так как "a"
не является нулевым, весь кусок ("b" ?? ("c" ?? "d"))
не должно быть решено. ??
выполняется только один раз.
Хотя значение справа не разрешено, проверка !== null
меньшее количество раз все еще может быть полезным.
(Тем не менее, мне интересно, это единственная причина?)
Каково значение этого?
По сравнению с троичным оператором (который является левоассоциативным), нулевой оператор слияния является правоассоциативным позволяет укладывать. Например:
Это не сработает
echo isset($foo) ? $foo :
isset($bar) ? $bar :
isset($baz) ? $baz :
'default';
Вот как вы можете ожидать, что троичный оператор будет работать по умолчанию, исходящий от C или C ++, но вы ошибаетесь. Новый ??
Оператор допускает следующую альтернативу:
Это будет работать
echo $foo ?? $bar ?? $baz ?? 'default';