2011-04-10 112 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块。