66

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

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

您个人使用哪种风格,或觉得最易读?

编辑:( 关于何时使用三元运算符)

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

4

15 回答 15

102

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

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

这样,条件和结果就保持在同一条线上,并且很容易浏览并了解正在发生的事情。

于 2008-10-28T13:39:46.533 回答
81

我尽量不使用三元运算符来编写嵌套条件。它违背了可读性,并且与使用条件相比没有提供额外的价值。

只有当它可以放在一条线上,并且它的含义非常清楚时,我才使用它:

$value = ($a < 0) ? 'minus' : 'plus';
于 2008-10-28T13:17:17.500 回答
26

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

if else if else
于 2008-10-28T13:14:08.600 回答
21

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

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

..但通常只有将它们全部放在一条线上会使其太长。我发现把= ? :所有的东西都排好会让它看起来更整洁。

于 2008-11-12T07:37:05.867 回答
15

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

Example #3 "Non-obvious Ternary Behaviour" 解释了为什么下面的代码在 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!
于 2009-09-25T02:17:24.647 回答
12

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

于 2008-10-28T13:15:05.383 回答
5

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

于 2008-10-28T13:23:05.990 回答
2

我会反对普遍的看法。我有点像 Imran 的条件运算符风格。如果它干净地放在一条线上,我将它放在一条线上。如果它不能完全适合一行,我会打破它,但我只使用一个制表符(4 个空格;我已将 VS 设置为为制表符插入空格)用于缩进。我不会立即跳到if- else,因为很多时候条件运算符在上下文中更有意义。(如果它在上下文中没有意义,但是,我根本不使用它。)

另外,我不嵌套条件运算符。在那一点上,我确实觉得它太难阅读了,是时候使用更冗长的if风格else了。

于 2008-10-28T13:17:09.780 回答
2

三元条件可以使代码更干净、更优雅,最重要的是,帮助你把重点放在正确的事情上,避免重复自己。考虑使用它们,但这样做不会降低代码的可读性。在 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

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

于 2011-02-04T20:21:49.650 回答
1

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

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

于 2008-11-12T07:50:55.963 回答
0

我不使用它。我总是觉得试图节省空间和输入源代码,期望小源代码 == 更有效的编译代码。

我觉得它根本不可读,但其中大部分是因为我从不使用它。

于 2008-10-28T13:13:32.843 回答
0

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

于 2008-10-28T13:13:48.567 回答
0

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

于 2008-10-28T13:24:45.783 回答
0
$foo = (isset($bar)) ? $bar : 'default';
于 2008-10-29T14:04:52.927 回答
0

我个人只使用它来分配一个变量(在java中),例如:

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

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

String val; [...]
int var = (val == null) ? 0 : Integer.parseInt(val);
于 2008-10-29T14:22:29.083 回答