可能重复:
Reference - What does this symbol mean in PHP?
To ternary or not to ternary?三元运算符在php中?
能有人请解释的优势/劣势或使用三元操作符代替if/else语句的。我应该在何时何地使用每个?
可能重复:
Reference - What does this symbol mean in PHP?
To ternary or not to ternary?三元运算符在php中?
能有人请解释的优势/劣势或使用三元操作符代替if/else语句的。我应该在何时何地使用每个?
三元运营商比,如果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++
,因为它简单,更写。
根据条件分配变量时使用三元组 – 2011-04-10 17:51:29
写出相同条件的替代方法的良好演示。 – Charles 2011-04-10 18:10:00
关于三元运算符的两个注意事项。首先:如果?:返回对象,那么您最终将获得该对象的副本而不是通过-ref赋值来解决此问题,您可以编写$ x? $ obj = $ y:$ obj = $ z而不是$ obj = $ x? $ y:$ z。第二:?:可能会导致运营商优先级问题,因此($ x + $ y)? $ z1:$ z2总是优于$ x + $ y? $ z1:$ z2。 – 2011-04-10 19:17:15
何时使用:从来没有。
PHP是伟大的,它的可读性。
人们可以理解没有语言语法的整个语句。
的通常,如果像这样的
if($age < 18) $error = "Too young!";
语句可以理解为几乎纯英文:
如果[给予]年龄小于18,错误将是“太年轻”
但你会怎么看这样的三元
$error = (($age < 18))? "Too young":"";
?
错误会年龄小于18?太年轻! [有些噪音]。
在大多数情况下,这是可怕的建议。 – 2011-04-10 18:06:20
你可以把第二个读为“错误,如果年龄小于18岁,就太年轻了”。我同意三元体系可能很丑,但是如果使用得当,它确实不难读。只是不要将它用于除简单赋值之外的任何事情,或者像简单的复数形式:'($ var> 1)? “s”:“”' – AgentConundrum 2011-04-10 18:10:08
我看不懂缺席的单词 – 2011-04-10 18:11:46
当单个条件的结果被分配给一个变量时,三元运算符工作得很好。它可以导致一个清晰,简洁的图表,显示导致变量状态的条件,而在if/else
语句中,您需要查看至少两行来确定结果。
$result = $condition > 5 ? "hello" : "world";
// is clearer & easier to read than
if ($condition > 5)
{
$result = "hello";
}
else
{
$result = "world";
}
在某些情况下,if/else语句可能非常麻烦。例如。比较以下两种:
$a = (condition ? 1 : 2)
与
if (condition) {
$a=1
}
else {
$a=2
}
每个人都专注于什么时候使用它,但它可能是值得知道什么时候不使用它。以下是如何不是的示例使用三元运算:
$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
块。
*(相关)* [这是什么符号在PHP中的意思](http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol-mean-in-php) – Gordon 2011-04-10 17:49:52
不应该这是一个不同的堆栈或讨论话题? – mcgrailm 2011-04-10 18:02:15