PHP操作符优先错误?

PHP操作符优先错误?,php,parsing,compiler-construction,operators,Php,Parsing,Compiler Construction,Operators,结果: var_dump(null != $a = 15); var_dump($a); 是: 为什么这个脚本没有触发错误? 自从=(非相等运算符)的优先级高于=(赋值运算符),$a应首先与null进行比较?我能找到的唯一原因是文档中说这仍然合法: 这似乎是上表所示的一个例外。这不是关于运算符优先级,而是关于:运算符优先级列表不会告诉您详细信息(实际上,它们从来不会告诉您),例如关于野牛规则以及由此产生的模式匹配和堆栈缩减。 让我们以语句null!=$a=15,为简单起见,无需var_转储。

结果:

var_dump(null != $a = 15);
var_dump($a);
是:

为什么这个脚本没有触发错误?
自从<代码>=(非相等运算符)的优先级高于
=
(赋值运算符),
$a
应首先与
null
进行比较?

我能找到的唯一原因是文档中说这仍然合法:


这似乎是上表所示的一个例外。

这不是关于运算符优先级,而是关于:运算符优先级列表不会告诉您详细信息(实际上,它们从来不会告诉您),例如关于野牛规则以及由此产生的模式匹配和堆栈缩减。
让我们以语句
null!=$a=15,为简单起见,无需var_转储。
这就是解析器“看到”这个语句的方式——或者:看到它是一个语句。
(我希望这将是一个固定宽度的字体呈现无处不在…)

(您可以在中查找规则)


在这种情况下,赋值运算符没有特殊规则;解析器没有其他方法匹配语句,因此优先级不适用。

肯定很奇怪
$a==null=15
也会给出错误转储。输入
(null!=$a)=15
确实会抛出一个意外的
=
错误。除了将其解释为
null!=($a=15)
有吗?使用
(null!=$a)=15
可以尝试将值15分配给布尔值;这不起作用。@VolkerK这是一个例子,这个脚本没有实际用途!如果(!$a=foo())
,我的思考从我经常看到(并使用)的这种表达式开始,然后同样的事情也适用。如何为(!$a)赋值?我想还有一点需要注意的是以下关于可读性的评论:“使用括号,即使不是严格必要的,也可以通过显式分组而不是依赖隐式运算符优先级和关联性来提高代码的可读性。”; 没有额外的lexer规则来明确地“允许”这一点。这只是正常的工作方式。手册中的示例只是提醒那些好奇的开发人员,但它似乎是页面顶部表格中的一个例外,不是吗?即使在解析器/词表中没有明确的规则,它似乎是对先前解释的一个例外。“沃尔克克调整了我的措辞,现在你认为它更正确吗?有一个运算符优先规则,这个表达式清楚地打破了规则,这被称为异常。不过没什么大不了的,我要继续。。。
bool(true)
int(15)
null                       !=                    $a                                  =   15                           ;
                                                 T_VARIABLE                           
identifier                                       compound_variable                       T_LNUMBER
namespace_name                                   reference_variable                      common_scalar
general_constant                                 base_variable                           scalar
scalar                                           base_variable_with_functions_calls      expr_without_variable
expr_without_variable                            variable                            =   expr
expr                       T_IS_NOT_EQUAL             \______ expr_without_variable _________/
   \__________________    expr ____________________________________________/                                          ;
                           \_________________       unticked_statement _______________________________________________/
                                                     statement