Результат:
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
Кажется, это исключение из того, что показано в таблице выше.
Речь идет не о приоритете операторов, а о том, что списки приоритетов операторов не сообщают вам подробности (на самом деле, они никогда не сообщают), например, о правилах бизонов и получающемся сопоставлении с образцом и уменьшении стека.
Давайте возьмем утверждение 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 )
В этом случае нет специального правила для оператора присваивания; у парсера просто нет другого способа сопоставить оператор, поэтому приоритет не применяется.