[英]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
它似乎是上表中显示的例外。
这不是关于运算符优先级,而是关于:运算符优先级列表不会告诉您详细信息(实际上,它们从不这样做),例如关于bison规则以及由此产生的模式匹配和堆栈减少。
我们把语句称为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查看规则)
在这种情况下,赋值运算符没有特殊规则; 根本没有其他解析器匹配语句的方法,因此优先级不适用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.