嵌套的 PHP 三元运算符优先级


Nested PHP ternary operator precedence

是的,我知道这是非常糟糕的代码,但我仍然想理解它:

$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");