嵌套PHP三元运算符优先级

时间:2013-09-16 23:15:44

标签: php

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

$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” - 括号对有什么影响?

2 个答案:

答案 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");