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上查看规则)
在这种情况下,赋值运算符没有特殊规则;解析器根本没有其他方法来匹配语句,因此优先级不适用。
结果:
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上查看规则)
在这种情况下,赋值运算符没有特殊规则;解析器根本没有其他方法来匹配语句,因此优先级不适用。