在PHP中同时运算符和赋值?

时间:2018-05-11 19:14:16

标签: php

在此声明中:

1 + $newVar = 200;

$ newVar被创建并被赋值为200.这是如何工作的? Precedence rules表示在分配之前首先进行添加。我无法绕过这个。如果首先使用+运算符计算变量,那么如何进行赋值?

PHP提供了这个小块。这是否意味着适用这些规则,除非它们不适用?

  

注意:

     

虽然=的优先级低于大多数其他运算符,但PHP会   仍然允许类似于以下的表达式:if(!$ a = foo())in   在哪种情况下,foo()的返回值被放入$ a。

2 个答案:

答案 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 '+' exprlink)。

下次,第二个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;