【问题标题】:Multiple conditions in the ternary operator safe?三元运算符中的多个条件安全吗?
【发布时间】:2011-11-09 08:36:06
【问题描述】:

我看到过建议说三元运算符不能嵌套。

我已经测试了下面的代码,它工作正常。我的问题是,我以前从未见过这样使用过的三元运算符。那么,这是否像在if 中使用的那样可靠,或者类似的东西以后会咬我(不是在条款或可读性方面,而是通过失败)。

$rule1 = true;
$rule2 = false;
$rule3 = true;

$res = (($rule1 == true) && ($rule2 == false) && ($rule3 == true)) ? true : false;

if($res) {
    echo "good";        
} else {
    echo "fail";
}

谢谢!

【问题讨论】:

  • 实际上你不需要? true : false 部分...你基本上会做类似于true ? true : false 的事情,这是多余的。
  • 这里没有错 - 很好
  • @Gordon:堆叠不是在做类似(condition) ? true : (condition) ? true : false的事情吗?
  • animuson 和 gordon 都在这一点上——如果你想清理代码,请参见下文。

标签: php if-statement ternary-operator


【解决方案1】:

这是合法的,不必“丑陋”。我经常使用“钩子”运算符,以表格形式它很干净,例如:

bool haveANeed() 
{ 
    //     Condition       result
    //     ----------      ------
    return needToEat()   ? true
         : needToSleep() ? true
         : needToStudy() ? true
         : needToShop()  ? true
         : needToThink() ? true
         :                 false; // no needs!
}

恕我直言,如果使用 if-else 逻辑编写,这个函数会不太清晰,而且肯定会更长。

【讨论】:

  • return needToEat() || needToSleep() || needToStudy() || needToShop() || needToThink(); 更短更清晰。
  • 你是对的。我只是想强调使用三元运算符的类似表格的简洁性。
【解决方案2】:

如果要返回 truefalse,则不需要三进制。 Quoting the manual:

如果 expr1 的计算结果为 TRUE,则表达式 (expr1) ? (expr2) : (expr3) 的计算结果为 expr2,如果 expr1 的计算结果为 FALSE,则表达式为 expr3。

这意味着

$res = (($rule1 == true) && ($rule2 == false) && ($rule3 == true));

将分配 true 或 false 已经。此外,如果不关心 $rule 是布尔值,则不需要与 == 进行比较。你也不需要大括号,例如

$res = $rule1 && !$rule2 && $rule3;

与你的初始三元相同。

当您有多个这样的表达式时,一个好的做法是将实际比较隐藏在有意义的方法或函数名称后面,例如

function conditionsMet($rule1, $rule2, $rule3) {
    return $rule1 && !$rule2 && $rule3;
}

然后你就可以了

if (conditionsMet($rule1, $rule2, $rule3)) {
    // do something
}

当然,conditionsMet 没有 意义。一个更好的例子是 isSummerTimeisEligibleForDiscount 等等。只需在方法名称中表达规则所表达的内容即可。

您可能还对Refactoring - Improving the design of existing code 一书中的Simplifying Conditional Expressions 感兴趣。

【讨论】:

    【解决方案3】:

    这是完全合法的,它可以工作并且“就像可靠一样”,但它看起来很丑。

    如果将每个三元语句放在括号内,嵌套也可以:

    $res = ( $rule1 ? true : ( $rule2 ? true : false ) )
    

    手册中唯一不建议的做法是嵌套不带括号,如下所示:

    $res = ( $rule1 ? true : $rule2 ? true : false )
    

    【讨论】:

    • 哦,我讨厌扫描嵌套的三元组,即使在括号中也是如此。避免 IMO :)
    • @webbie 同意,我的“它看起来很丑”这句话实际上应该翻译成“避免”:) 但这是一个完全有效的声明。
    【解决方案4】:

    你也可以这样做

     $res = ($rule1 && !$rule2 && $rule3);
    

    【讨论】:

      【解决方案5】:

      如果您从三元运算符返回的结果只有“真”和“假”,那么您甚至不需要该运算符。你可以有:

      $res = (($rule1 === true) && ($rule2 === false) && ($rule3 === true))
      

      但是,要回答您的问题,是的,多个条件都可以很好地工作。

      【讨论】:

      • 您甚至不需要=== true=== false 部分(OP 的问题没有使用严格比较)。
      【解决方案6】:

      您是否有理由希望将条件保存到变量中?这是上面的简化版本。

      if($rule1 && !$rule2 && $rule3)
      {
          echo "good";
      }
      else
      {
          echo "bad";
      }
      

      【讨论】:

      • 同意。除非他稍后再次使用该布尔值,否则将其放入 If 会更好,并且不会分配一个不再使用的无用变量。
      猜你喜欢
      • 2012-09-14
      • 2011-06-26
      • 2013-01-14
      • 2013-06-06
      • 2012-10-03
      • 2018-03-06
      • 2015-08-29
      • 2021-11-20
      • 2020-05-18
      相关资源
      最近更新 更多