2015-07-03 35 views
3
$i = 2; 
$result = ($i == 2) ? "Two" : ($i == 1) ? "One" : "Other"; 

echo $result; // outputs: One 

雖然相同的代碼在C#輸出:兩個爲什麼PHP會提供意想不到的輸出?

int i=2; 
String result = (i == 2) ? "Two" : (i == 1) ? "One" : "Other" ; 
Console.Write(result); // outputs: Two 
+3

這並不意外,它只是非直觀的....這正是爲什麼文檔建議反對嵌套三元組:'注意: 建議您避免「疊加」三元表達式。在單個語句中使用多個三元運算符時,PHP的行爲是不明顯的# –

+1

您對編譯器沒有心臟。堆疊三元組... –

回答

5

三元運算符的計算LEFT-TO-RIGHT

($i == 2) ? "Two" : ($i == 1) ? "One" : "Other" 
"Two" ? "One" : "Other" // first part evaluated to "Two" 
"One"     // non-empty strings evaluate to true 

所以,你應該在你的輸出,而不是Other得到One。這有點棘手。

manual明智的話:

建議您避免「堆積」三元表達式。在單個語句中使用多個三元運算符時,PHP的行爲並不明顯。

+0

你說得對。我解決了我的問題 – Ahmad

2

的解釋已經被@light提供,但要獲得你想要你需要額外的括號結果:

$i = 3; 
$result = ($i == 2) ? "Two" : (($i == 1) ? "One" : "Other"); 
echo $result, PHP_EOL; 

$i = 2; 
$result = ($i == 2) ? "Two" : (($i == 1) ? "One" : "Other"); 
echo $result, PHP_EOL; 

$i = 1; 
$result = ($i == 2) ? "Two" : (($i == 1) ? "One" : "Other"); 
echo $result, PHP_EOL; 

Demo

0

這是因爲C#是強類型和需要布爾值是三元運算符的第一個參數,而PHP是鬆散類型的,基本上每個值都可以轉換爲它的布爾等值。另外,三元運算符從左到右進行評估。這是什麼意思?

在我們需要Boolean在操作者的非常左側C#,所以此表達式:

String result = (i == 2) ? "Two" : (i == 1) ? "One" : "Other" ; 

將按照該順序進行評估:

String result = (i == 2) ? "Two" : ((i == 1) ? "One" : "Other"); 

i==2等於true所以"Two"將被分配作爲最終結果。在PHP中,它看起來有點不同。我們可以解釋這個表達式:

$result = ($i == 2) ? "Two" : ($i == 1) ? "One" : "Other"; 

這樣

$result = (($i == 2) ? "Two" : ($i == 1)) ? "One" : "Other"; 

$i等於2,所以重視"Two"將是第一個表達式的結果。 PHP中的非空字符串值等於true,因此「One」將是最終結果。

相關問題