最近我发现了这样的片段:
$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)
为什么会这样,而不是根据运营商的优先顺序?
答案 0 :(得分:2)
您作为单独注释链接到州的operator precedence sheet:
虽然=的优先级低于大多数其他运算符,但PHP会 仍然允许类似于以下的表达式:if(!$ a = foo())in 在哪种情况下,foo()的返回值被放入$ a。
因此,实际上,表达式中的赋值将被视为有点像子表达式。究竟如何以及何时发生这种情况在文档中并不清楚,文档只是声明“类似的”表达式将以这种方式工作。