2016-10-05 7 views
1

PHPのドキュメントによると、null合体演算子??は右結合であるの右結合性、すなわちPHPのnull合体演算子

$a ?? $b ?? $c 

$a ?? ($b ?? $c) 

これの意味は何に相当しているのですか?それが左結合または右結合であることを、開発者のためのすべての違いを作るのか?

左オペランドが私のテストによるとnullでない場合、右オペランドは評価されませんので、それはあまり関数を呼び出します考えている人には、これは真実ではありません。

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 'は、機能だろう場合は、それが残っているならば、これは全く別の実行につながりますまたは単純な例として右結合的である。あなたが '' ??に追加の異なる演算子を使用する場合は、同じことが、コードは完全に別の実行「associativeness」に応じて起こります。 – Rizier123

+0

Rizier123は今それでしょうか@? https:// 3v4l。org/PvvSr – deceze

+0

FWIW、私は左の連想の '?? '演算子が積み重ねられた' ??'演算子と組み合わせて異なる結果を生成することは考えられません。それは内部短絡に関連するようにしか見えない。つまり、左結合式の '?? '演算子は、できるだけ早く戻すのではなく、(オペランドでなくても)スタックされたすべての式を常に評価します。あなたは他の演算子と組み合わせて別の動作を見つけるかもしれません。 – deceze

答えて

-1

に動作します(最初の値が非nullの場合)それが右結合的である場合にのみ一度だけ左結合である場合に限る。これらの2つの場合を比較する:

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

を最初の行には、第二(内側)が解決され?? "b"括弧の後に、第一(外側)内の値は、最終的な?? "d"が解決され、?? "c"は解決されかっこ。 ??を3回行う。

2行目では"a"がヌルではないため、("b" ?? ("c" ?? "d"))のチャンク全体を解決する必要はありません。 ??一度だけ実行されます。

右辺値が解決されていないが、!== null少ない時間をチェックすることは、まだ有益であるかもしれません。

(これが唯一の理由である場合でも、私は疑問に思う?)

-2

この重要性は何ですか? (連想を残している)三項演算子と比較

、ヌル合体演算子は右結合であるを積み重ねることを可能にします。たとえば:

これは、これはあなたが三項演算子はCまたはC++から、デフォルトで動作するように期待するかもしれない方法です

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

動作しませんが、あなたは間違っているだろう。新しい??オペレータは、次の代替が可能になります:

これは、私はあなたが??を複数回評価する必要がパフォーマンスの問題、考えています

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

左結合の場合はどういう意味ですか、 '(($ foo ?? $ bar)?? $ baz)?? 'default''? – SOFe

+0

@PEMapModder何も間違っている、それはちょうどクリーナー/構文的な砂糖です。 –

+0

あなたはその質問に答えていません。 「クリーナー/統語砂糖」は純粋に意見に基づくと思われる。 – SOFe