PHP运算符优先级错误?

时间:2015-10-26 15:39:35

标签: php parsing compiler-construction operators

结果:

shell_exec('php yourotherscript.php > /dev/null 2>/dev/null &');

是:

var_dump(null != $a = 15);
var_dump($a);

为什么此脚本不会触发错误? 由于bool(true) int(15) (不等于运算符)的优先级高于!=(赋值运算符),因此首先应将=$a进行比较?

2 个答案:

答案 0 :(得分:6)

我能找到的唯一原因是文档说这仍然是合法的:http://php.net/manual/en/language.operators.precedence.php#example-129

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

答案 1 :(得分:2)

这不是关于运算符优先级,而是关于:运算符优先级列表不会告诉您详细信息(实际上,它们从不这样做),例如:关于野牛规则以及由此产生的模式匹配和堆栈减少 为简单起见,我们不要使用var_dump语句null != $a = 15; 这就是解析器"看到"这句话 - 或者:看到它一个陈述 (我希望这将在任何地方以固定宽度字体呈现......)

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

查找规则

在这种情况下,赋值算子没有特殊规则;解析器根本没有其他方式来匹配语句,因此优先级不适用。