2016-10-05 11 views
1

Согласно PHP документации, нулевой оператор коалесцирующий ?? является правоассоциативной, т.е.правой ассоциативности нулевого Coalesce оператора РНР

$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" 
+0

Если '$ a',' $ b' и '$ c' бы функции, то это приведет к совершенно различным казням, если он остается или правым ассоциативным как простой пример. Если вы используете разные операторы, дополнительные для '??', то одно и то же происходит в зависимости от «ассоциативности», код выполняет совершенно разные. – Rizier123

+0

@ Rizier123 Будет ли это сейчас? https: // 3v4l.org/PvvSr – deceze

+0

FWIW, я не могу придумать ни одного случая, когда лево-ассоциативный '' 'оператор мог бы производить разные результаты в сочетании со сложными' '' операторами. Это похоже только на внутреннее короткое замыкание; то есть лево-ассоциативный оператор '' 'всегда будет оценивать все сложенные выражения (даже если не их операнды), а не возвращаться как можно скорее. Однако вы можете найти другое поведение, сочетающее его с другими операторами. – deceze

ответ

-1

Я имею в виду проблемы с производительностью, где вы должны оценить ?? несколько раз (если первое значение не является нулевым) если он лево-ассоциативный, а один раз, только если он является право-ассоциативным. Сравните эти два случая:

(("a" ?? "b") ?? "c") ?? "d" 
"a" ?? ("b" ?? ("c" ?? "d")) 

На первой линии, после того, как второй (внутренний) круглые скобки ?? "b" разрешен, значение внутри первого (внешний) круглые скобки ?? "c" разрешен, то окончательное ?? "d" будет решена. ?? выполняется 3 раза.

Во второй строке, поскольку "a" не является нулевым, весь фрагмент ("b" ?? ("c" ?? "d")) не нужно разрешать. ?? выполняется только один раз.

Несмотря на то, что значение в правой части не разрешено, проверка !== null в меньшем масштабе может оказаться полезным.

(Тем не менее, мне интересно, если это единственная причина?)

-2

В чем смысл этого?

По сравнению с троичным оператором (который левоассоциативный), оператор нулевой COALESCE будучи правоассоциативной позволяет для укладки. Например:

Это не будет работать

echo isset($foo) ? $foo : 
    isset($bar) ? $bar : 
    isset($baz) ? $baz : 
    'default'; 

Это, как вы могли бы ожидать, тройные работу оператора по умолчанию наступающего из C или C++, но вы бы неправильно. Новый оператор ?? позволяет следующей альтернативе:

Это будет работать

echo $foo ?? $bar ?? $baz ?? 'default'; 
+1

И что не так, если он лево-ассоциативный, т. Е. '(($ Foo ?? $ bar)? $ Baz)? «Default''? – SOFe

+0

@PEMapModder ничего не случилось, это просто чище/синтаксический сахар. –

+0

Тогда вы не отвечаете на вопрос. «Чистый/синтаксический сахар», по-видимому, чисто основан на мнениях. – SOFe