是的,我知道这是非常糟糕的代码,但我仍然想了解它:
$out = $a > 9 && $a < 15 ? "option1" : $a < 5 ? "option2" : "option3";
$out = $a > 9 && $a < 15 ? "option1" : ($a < 5 ? "option2" : "option3");
如果$a
是11,那么第1行的结果是“选项2”,但是在第2行,结果是“选项1” - 括号对有什么影响?
答案 0 :(得分:7)
您获得的未加密码的代码被解析为:
$out = (
(
($a < 9 && $a < 15)
? ("option1")
: ($a < 5)
)
? ( "option2" )
: ( "option3" )
);
这是因为PHP's ternary operator is left-associative。这与所有其他语言的工作方式完全相反,最终以令人惊讶的(几乎总是无用的!)方式解释链式三元表达式。这被广泛认为是一个错误,但是它太老了,无法解决问题,就像C&C二进制运算符的类似优先问题一样。
在第二个表达式中添加括号会产生预期的:
$out = (
($a > 9 && $a < 15)
? ("option1")
: (
($a < 5)
? ("option2")
: ("option3")
)
);
答案 1 :(得分:4)
第一行解析如下:
$out = ($a > 9 && $a < 15 ? "option1" : $a < 5) ? "option2" : "option3";
这相当于以下(当$a == 11
时):
$out = "option1" ? "option2" : "option3";
"option1"
强制布尔为true
,因此以上评估为"option2"
。
第二个正在按照您的预期进行解析:
$out = ($a > 9 && $a < 15) ? "option1" : ($a < 5 ? "option2" : "option3");