PHP 运算符优先级错误?

PHP operator precedence bug?

结果:

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

是:

bool(true)
int(15)

为什么这个脚本没有触发错误? 由于 !=(不等于运算符)的优先级高于 =(赋值运算符),因此 $a 应该先与 null 进行比较?

我能找到的唯一原因是文档说这仍然是合法的:http://php.net/manual/en/language.operators.precedence.php#example-129

上面table中显示的内容似乎是个例外。

这不是关于运算符优先级的,而是关于:运算符优先级列表不会告诉你细节(真的,他们从来没有),例如关于野牛规则和由此产生的模式匹配和堆栈减少。
让我们采用语句 null != $a = 15;,为简单起见,没有 var_dump.
这就是解析器 "sees" 这个语句的方式 - 或:看到它 一个语句。
(我希望这将在任何地方都以固定宽度的字体呈现...)

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                                 

(你可以在https://github.com/php/php-src/blob/PHP-5.6.15/Zend/zend_language_parser.y上查看规则)

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