您使用哪种编码方式用于三元运算符?

时间:2008-10-28 13:10:43

标签: php language-agnostic coding-style ternary-operator

如果它很短,我会保持单线。最近我一直在使用这种风格用于更长或嵌套的三元运算符表达式。一个人为的例子:

$value = ( $a == $b ) 
            ? 'true value # 1'
            : ( $a == $c )
                ? 'true value # 2'
                : 'false value';

您个人使用哪种风格,或者发现最具可读性?

编辑: (何时使用三元运营商)

我通常避免使用超过2级深度三元运算符。当我在PHP模板脚本中回显变量时,我倾向于更喜欢2级深度三元运算符而不是2级别。

15 个答案:

答案 0 :(得分:85)

通常要避免使用三元运算符,但这种形式可以很容易阅读:

  result = (foo == bar)  ? result1 :
           (foo == baz)  ? result2 :
           (foo == qux)  ? result3 :
           (foo == quux) ? result4 : 
                           fail_result;

通过这种方式,条件和结果在同一条线上保持在一起,并且可以很容易地浏览并了解正在发生的事情。

答案 1 :(得分:77)

我尽量不使用三元运算符来编写嵌套条件。它无视可读性,并且没有使用条件的额外价值。

只有它可以放在一条线上,并且它的结晶清晰意味着什么,我就用它:

$value = ($a < 0) ? 'minus' : 'plus';

答案 2 :(得分:24)

就个人而言,我只使用三元运算符,如果它适合一行。如果它需要跨越,那么现在是时候了好的

if else if else

答案 3 :(得分:13)

有时使用的一种风格,我提到它,因为它没有被提及,是这样的:

$result = ($x == y)
        ? "foo"
        : "bar";

..但通常只有将它全部放在一行上才会使它太长。我发现= ? :所有排队都让它看起来更整洁。

答案 4 :(得分:13)

PHP嵌套的三元运算符表现不同。

此语法通过了以下所有测试。 基于http://deadlytechnology.com/web-development-tips/php-ternary-syntax/

$myvar = ($x == $y)
?(($x == $z)?'both':'foo')
:(($x == $z)?'bar':'none');

请参阅:http://au.php.net/ternary

示例#3“非显而易见的三元行为”解释了为什么以下内容在PHP中不起作用。

$x = 1;
$y = 2;
$z = 3;   
$myvar = ($x == $y) 
       ? "foo" 
       : ($x == $z) 
         ? "bar" 
         : "none";  
$myvar == 'none'; // Good

$x = 1;
$y = 2;
$z = 1;   
$myvar = ($x == $y) ? "foo" : ($x == $z) ? "bar" : "none";  
$myvar == 'bar'; // Good

$x = 1;
$y = 1;
$z = 3;   
$myvar = ($x == $y) ? "foo" : ($x == $z) ? "bar" : "none";  
$myvar == 'bar'; // Bad!

$x = 1;
$y = 1;
$z = 1;   
$myvar = ($x == $y) ? "foo" : ($x == $z) ? "bar" : "none";  
$myvar == 'bar'; // Bad!

答案 5 :(得分:9)

三元运算符是编写简单if语句的简短有效方法。它们不应嵌套或难以阅读。请记住:您只需编写一次软件,但会被读取100次。它应该比阅读更容易阅读。

答案 6 :(得分:4)

我倾向于将条件括在括号中:(a == b)? 1:0

答案 7 :(得分:2)

我不同意共同意见。我有点像我的条件运算符样式的Imran。如果它在一条线上干净利落,我将它保持在一条线上。如果它不能完全适合一行,我会打破它,但我只使用一个标签(4个空格;我有VS设置为标签插入空格)用于缩进。我没有立即跳转到if - else,因为很多时候条件运算符在上下文中更有意义。 (但是,如果它在上下文中没有意义,我只是不使用它。)

另外,我没有嵌套条件运算符。那时候,我觉得它很难阅读,现在是时候采用更冗长的if - else风格了。

答案 8 :(得分:1)

“人为的例子”是我如何缩进它,除了我会从左边距缩进,而不是基于(或者上面的任何内容)。

对于三元批评者 - 可读性是重点。如果您认为它不会产生更易读的代码,请不要使用它。但我发现至少在某些时候情况恰恰相反。

答案 9 :(得分:1)

三元条件可以使代码更清晰,更优雅,最重要的是,帮助您强调正确的事情,避免重复自己。考虑使用它们,但这样做不会使代码的可读性降低。在VB.NET中:

'before refactoring 
If x = 0 Then                    ' If-Then-Else puts emphasis on flow control
    label = "None"
Else
    label = Foo.getLabel(x)      '  If-Then-Else forces repeat of assignment line
End If

'after refactoring    
label = If(x = 0, "None", Foo.getLabel(x)) ' ternary If puts emphasis on assignment

请注意,“它的可读性较差”与“我不习惯看到”不一样。

答案 10 :(得分:0)

我不使用它。它总是闻到我的味道,就像试图节省空间和输入源代码一样,期望小源=更高效的编译代码。

我发现它根本不可读,但其中很多是因为我从不使用它。

答案 11 :(得分:0)

我倾向于根本不使用三元运算符,因为我发现..其他更可读。

答案 12 :(得分:0)

伊姆兰,你已经将这种格式美化了。但是,当你嵌套两个以上时,三元运算符确实会变得难以理解。 if-else块可能会为您提供额外的可理解嵌套级别。除此之外,使用函数或表驱动编程。

答案 13 :(得分:0)

$foo = (isset($bar)) ? $bar : 'default';

答案 14 :(得分:0)

我个人仅将它用于变量的赋值(在java中),例如:

String var = (obj == null) ? "not set" : obj.toString();

和(其他示例)使用不允许空参数的函数时:

String val; [...]
int var = (val == null) ? 0 : Integer.parseInt(val);