Questo non riguarda la precedenza degli operatori ma riguarda: gli elenchi di precedenza degli operatori non indicano i dettagli (in realtà, essi non fanno mai), ad es. riguardo le regole del bisonte e la conseguente corrispondenza del modello e riduzione dello stack.
Prendiamo la dichiarazione null != $a = 15;
, per semplicità senza var_dump.
Questo è il modo in cui il parser "vede" questa affermazione - oppure: vede che lo è una dichiarazione.
(spero che questo sarà reso con un carattere fisso-larghezza ovunque ...)
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
(È possibile cercare le regole a https://github.com/php/php-src/blob/PHP-5.6.15/Zend/zend_language_parser.y)
Non esiste una regola speciale per l'operatore di assegnamento in questo caso; semplicemente non esiste un altro modo per far sì che il parser corrisponda all'istruzione, quindi la precedenza non si applica.
decisamente strano. '$ a == null = 15' dà anche dump falsi. E mettere in '(null! = $ A) = 15' sputa un errore' = 'inaspettato. –
Quale alternativa all'interpretazione come 'null! = ($ A = 15)' c'è? Con '(null! = $ A) = 15' proverai ad assegnare il valore 15 ad un valore booleano; quello non funziona – VolkerK
@VolkerK questo è un esempio, questo script non ha uno scopo di vita reale! La mia riflessione inizia con questo tipo di espressione che vedo (e uso) molto 'if (! $ A = foo())'. –