是的,我知道这是非常糟糕的代码,但我仍然想理解它:
$out = $a > 9 && $a < 15 ? "option1" : $a < 5 ? "option2" : "option3";
$out = $a > 9 && $a < 15 ? "option1" : ($a < 5 ? "option2" : "option3");
如果$a
是 11,那么第一行的结果是"选项 2",但在第二行中,结果是"选项 1"——这对括号有什么影响?
您获得的无括号代码解析为:
$out = (
(
($a < 9 && $a < 15)
? ("option1")
: ($a < 5)
)
? ( "option2" )
: ( "option3" )
);
这是因为 PHP 的三元运算符是左关联的。这与它在所有其他语言中的工作方式完全相反,最终以一种令人惊讶(几乎总是无用!)的方式解释链式三元表达式。这被广泛认为是一个错误,但"太旧而无法修复",就像 C 的二进制运算符的一些类似的优先级问题一样。
在第二个表达式中添加括号将得到预期的结果:
$out = (
($a > 9 && $a < 15)
? ("option1")
: (
($a < 5)
? ("option2")
: ("option3")
)
);
第一行解析如下:
$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");