繁体   English   中英

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

它似乎是上表中显示的例外。

这不是关于运算符优先级,而是关于:运算符优先级列表不会告诉您详细信息(实际上,它们从不这样做),例如关于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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM