三元运算符的多个条件安全吗?

时间:2011-09-02 17:09:33

标签: php if-statement ternary-operator

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

我已经测试了下面的代码,它运行正常。我的问题是,我之前没有看过这样使用的三元运算符。那么,这是否像在if中使用的那样可靠,或者这样的事情可能会在以后引起我的兴趣(不是在术语或可读性方面,而是在失败的情况下)。

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

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

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

谢谢!

6 个答案:

答案 0 :(得分:24)

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

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

但是,要回答你的问题,是的,多个条件的效果非常好。

答案 1 :(得分:4)

这是完全合法的,它有效并且“尽可能可靠”,但它看起来很难看。

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

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

本手册中唯一建议不要使用括号拼写:

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

答案 2 :(得分:4)

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

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

答案 3 :(得分:3)

如果您要返回truefalse,则不需要三元组。 Quoting the manual:

  

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

这意味着

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

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

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

与您的初始三元相同。

当你有多个这样的表达式时,一个好习惯就是隐藏有意义的方法或函数名后面的实际比较,例如

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

然后你可以做

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

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

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

答案 4 :(得分:1)

您也可以

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

答案 5 :(得分:-1)

这是合法的,不一定是“丑陋的”。我经常使用“钩子”操作符,表格形式很干净,例如:

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

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

相关问题