在此声明中:
1 + $newVar = 200;
$ newVar被创建并被赋值为200.这是如何工作的? Precedence rules表示在分配之前首先进行添加。我无法绕过这个。如果首先使用+运算符计算变量,那么如何进行赋值?
PHP提供了这个小块。这是否意味着适用这些规则,除非它们不适用?
注意:
虽然=的优先级低于大多数其他运算符,但PHP会 仍然允许类似于以下的表达式:if(!$ a = foo())in 在哪种情况下,foo()的返回值被放入$ a。
答案 0 :(得分:1)
如果首先使用+运算符计算变量,那么如何进行赋值?
+
运算符不一定先评估,而docs对此非常清楚
运算符优先级和关联性仅确定表达式的分组方式,它们不指定评估顺序。 PHP不会(在一般情况下)指定评估表达式的顺序,并且应该避免采用特定评估顺序的代码,因为行为可以在PHP版本之间更改,或者取决于周围的代码。
在不同版本上测试几个场景时,很明显首先评估赋值运算符(如您所观察到的),因为首先评估+
运算符会抛出一个解析错误:
(1 + $n) = 200;
PHP解析错误:语法错误,意外' ='在第1行的php shell代码中
如果您想确定这将如何跨版本执行,最佳做法是为您所需的结果提供更明确的分组 - 例如:
1 + ($n = 200);
答案 1 :(得分:1)
我不完全确定这个答案。如果知道的话,有人可以帮助我。
此文件来自PHP源代码(https://github.com/php/php-src/blob/eb39d8d6863ab1f327417b274fed7a41b58daf1e/Zend/zend_language_parser.y)
如果看一看,this是解释器评估表达式的点。
第一次,它会获取1
,然后是+
符号,评估为expr '+' expr
(link)。
下次,第二个expr
评估为variable '=' expr
($ newVar = 200)(link)。
通过在内部解决这个问题,
expr(1) + expr($newVar = 200)
expr(1) + expr($newVar(200))
201
如果你echo (1.00 + $newVar = 200);
,它将输出201,但$newVar
得到200;