PHP中的逻辑与赋值运算符优先级

时间:2018-04-18 08:46:14

标签: php operator-precedence

最近我发现了这样的片段:

$x = 2 && $y = 3; echo (int)$x.':'.(int)$y;

产生输出1:3。 通过查看运算符precedence sheet,我发现逻辑运算符||&&的优先级高于赋值运算符=。因此,第一个表达式应该被评估为$x = (2 && $y) = 3;,它变为$x = (2 && null) = 3;并最终计算为$x = false = 3;其次 - 赋值运算符具有正确的关联性,因此解释器应该尝试执行false = 3这是非法的当然。所以在我看来,上面提到的代码片段根本不应该编译,必须抛出解析或运行时错误。但不是那个脚本产生1:3。这意味着解释器执行的操作是:

  

a)$ y = 3

     

b)2&& $ y

     

c)$ x =(2&& $ y)

为什么会这样,而不是根据运营商的优先顺序?

1 个答案:

答案 0 :(得分:2)

您作为单独注释链接到州的operator precedence sheet

  

虽然=的优先级低于大多数其他运算符,但PHP会   仍然允许类似于以下的表达式:if(!$ a = foo())in   在哪种情况下,foo()的返回值被放入$ a。

因此,实际上,表达式中的赋值将被视为有点像子表达式。究竟如何以及何时发生这种情况在文档中并不清楚,文档只是声明“类似的”表达式将以这种方式工作。