парсинг — ошибка приоритета оператора PHP?

Результат:

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

является:

bool(true)
int(15)

Почему этот скрипт не вызывает ошибку?
поскольку != (не равный оператор) имеет более высокий приоритет, чем = (оператор присваивания), $a следует сравнить с null первый?

7

Решение

Единственная причина, по которой я могу найти это то, что в документации сказано, что это все еще законно: http://php.net/manual/en/language.operators.precedence.php#example-129

Кажется, это исключение из того, что показано в таблице выше.

6

Другие решения

Речь идет не о приоритете операторов, а о том, что списки приоритетов операторов не сообщают вам подробности (на самом деле, они никогда не сообщают), например, о правилах бизонов и получающемся сопоставлении с образцом и уменьшении стека.
Давайте возьмем утверждение null != $a = 15;для простоты без var_dump.
Вот как парсер «видит» это утверждение — или: видит, что оно является заявление.
(Я надеюсь, что это будет отображаться со шрифтом фиксированной ширины везде …)

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 )

В этом случае нет специального правила для оператора присваивания; у парсера просто нет другого способа сопоставить оператор, поэтому приоритет не применяется.

2