2011-04-10 115 views
2

可能重複:
Reference - What does this symbol mean in PHP?
To ternary or not to ternary?三元運算符在php中?

能有人請解釋的優勢/劣勢或使用三元操作符代替if/else語句的。我應該在何時何地使用每個?

+0

*(相關)* [這是什麼符號在PHP中的意思](http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol-mean-in-php) – Gordon 2011-04-10 17:49:52

+1

不應該這是一個不同的堆棧或討論話題? – mcgrailm 2011-04-10 18:02:15

回答

12

三元運營商比,如果else語句更爲簡潔(這是良好的可寫性),但是當你你有一個條件,你的工作應該真的只使用它們。嵌套的三元運算符確實降低了可讀性。

一般來說,我只用三進制運算符時:

1)基於條件我指定的變量。

and

2)只有一個條件。

否則,他們會變得混亂,這使得難以維護。

例子:

$port = ($secure) ? 443 : 80; 

而如果其他人將是:

if($secure){ 
    $port = 443; 
} else { 
    $port = 80; 
} 

你甚至可以做出更好的做:

$port = 80; 
if($secure){ 
    $port = 443; 
} 

但是你可以看到,使用簡單的三元運算符更加簡潔(因爲您可以在較少的'空間'中獲得您的想法)。

您可能會聲稱這會降低可讀性,但只會稍微降低可讀性。正如我之前所說的,不要爲這個操作符而瘋狂,因爲它會降低可讀性以至於不值得。請記住,使用編程語言是一種平衡。更可寫的用一個簡單的三元運營商,這是在編程語言的一個重要因素。

在主場迎戰可寫的可讀性 - 點,我想指出一個specfic例子。

$count++ 

$count = $count + 1 // or $count += 1 

第二個例子是,大多數cerntaintly更具可讀性,你知道到底是怎麼回事,但是9/10時候,你會選擇做$count++,因爲它簡單,更寫。

+0

根據條件分配變量時使用三元組 – 2011-04-10 17:51:29

+0

寫出相同條件的替代方法的良好演示。 – Charles 2011-04-10 18:10:00

+0

關於三元運算符的兩個注意事項。首先:如果?:返回對象,那麼您最終將獲得該對象的副本而不是通過-ref賦值來解決此問題,您可以編寫$ x? $ obj = $ y:$ obj = $ z而不是$ obj = $ x? $ y:$ z。第二:?:可能會導致運營商優先級問題,因此($ x + $ y)? $ z1:$ z2總是優於$ x + $ y? $ z1:$ z2。 – 2011-04-10 19:17:15

-2
  • 優點:欺騙性簡潔
  • 缺點:可怕的可讀性

何時使用:從來沒有。

PHP是偉大的,它的可讀性。
人們可以理解沒有語言語法的整個語句。
的通常,如果像這樣的

if($age < 18) $error = "Too young!"; 

語句可以理解爲幾乎純英文:

如果[給予]年齡小於18,錯誤將是「太年輕」

但你會怎麼看這樣的三元

$error = (($age < 18))? "Too young":""; 

錯誤會年齡小於18?太年輕! [有些噪音]。

+0

在大多數情況下,這是可怕的建議。 – 2011-04-10 18:06:20

+0

你可以把第二個讀爲「錯誤,如果年齡小於18歲,就太年輕了」。我同意三元體系可能很醜,但是如果使用得當,它確實不難讀。只是不要將它用於除簡單賦值之外的任何事情,或者像簡單的複數形式:'($ var> 1)? 「s」:「」' – AgentConundrum 2011-04-10 18:10:08

+0

我看不懂缺席的單詞 – 2011-04-10 18:11:46

2

當單個條件的結果被分配給一個變量時,三元運算符工作得很好。它可以導致一個清晰,簡潔的圖表,顯示導致變量狀態的條件,而在if/else語句中,您需要查看至少兩行來確定結果。

$result = $condition > 5 ? "hello" : "world"; 

// is clearer & easier to read than 
if ($condition > 5) 
{ 
    $result = "hello"; 
} 
else 
{ 
    $result = "world"; 
} 
0

在某些情況下,if/else語句可能非常麻煩。例如。比較以下兩種:

$a = (condition ? 1 : 2) 

if (condition) { 
$a=1 
} 
else { 
$a=2 
} 
1

每個人都專注於什麼時候使用它,但它可能是值得知道什麼時候使用它。以下是如何不是的示例使用三元運算:

$foo = $bar == 1 ? 'a' : $bar == 2 ? 'b' : 'c'; 

快速,當$bar爲1,什麼是$foo?如果你回答'a',你是錯誤!從PHP交互式提示:

php > $bar = 1; $foo = $bar == 1 ? 'a' : $bar == 2 ? 'b' : 'c'; echo $foo; 
b 
php > $bar = 2; $foo = $bar == 1 ? 'a' : $bar == 2 ? 'b' : 'c'; echo $foo; 
b 

Yikes! PHP的操作順序是在這裏。我們必須添加parens以消除歧義:

$foo = $bar == 1 ? 'a' : ($bar == 2 ? 'b' : 'c'); 

這很快變得不可讀。如果你想使用運營商,只有使用它的一個條件。如果您需要if-elseif-else邏輯,請使用真正的if塊。