我看过一些建议,说三元运算符不能嵌套。
我已经测试了下面的代码,它运行正常。我的问题是,我之前没有看过这样使用的三元运算符。那么,这是否像在if
中使用的那样可靠,或者这样的事情可能会在以后引起我的兴趣(不是在术语或可读性方面,而是在失败的情况下)。
$rule1 = true;
$rule2 = false;
$rule3 = true;
$res = (($rule1 == true) && ($rule2 == false) && ($rule3 == true)) ? true : false;
if($res) {
echo "good";
} else {
echo "fail";
}
谢谢!
答案 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)
如果您要返回true
或false
,则不需要三元组。 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
不 有意义。一个更好的例子是isSummerTime
或isEligibleForDiscount
等等。只需表达规则在方法名称中表达的内容。
您可能还会对书籍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逻辑编写,恕我直言,这个函数会不那么清晰,肯定会更长。