2016-10-05 44 views
1

根據PHP文件中,空合併運算符??是右結合的右結合,即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" 
+0

如果'$了','$ B'和'$ C'是函數,則這將導致完全不同的執行,如果它是左或右聯合作爲一個簡單的例子。如果你使用''''以外的其他操作符,那麼同樣的事情會發生,這取決於代碼執行完全不同的「關聯性」。 – Rizier123

+0

@ Rizier123現在呢? https://開頭3v4l。org/PvvSr – deceze

+0

FWIW,我想不出任何一個左連接的'??'操作符與疊加的'??'操作符結合產生不同結果的情況。它似乎只與內部短路有關;即一個左結合的「??」運算符總是會評估所有堆棧表達式(即使不是它們的操作數),而不是儘快返回。不過,您可能會發現將其與其他運營商結合的不同行爲 – deceze

回答

-1

我正在考慮性能問題,在這裏你必須評估??多次(如果第一個值不爲null)如果它是左聯合的,而只有聯合的聯合。比較這兩種情況:

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

在第一行,第二(內)括號?? "b"後得到解決,內側的第一(外)的值括號?? "c"得到解決,則最終?? "d"得到解決。 ??執行3次。

在第二行,由於"a"不爲空,所以("b" ?? ("c" ?? "d"))的整個塊不需要解析。 ??只執行一次。

雖然右側的值沒有解決,但檢查!== null次數可能仍然有好處。

(不過,我不知道這是否是這個原因嗎?)

-2

這是什麼意思?

相比三元運算符(其左結合),空聚結操作者是右結合允許堆疊。例如:

這將無法正常工作

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