这是代码
$a = 2;
$a && $a = 1;
var_dump( $a ); // result 1
为什么$a是1?
根据该文件,逻辑运算符'&;'具有比赋值运算符更高的优先级,则应将其解释为($a&&$a(=1,然后应该存在语法错误。
来自文档
注意:
尽管=
的优先级低于大多数其他运算符,但PHP仍然允许类似以下的表达式:if (!$a = foo())
,在这种情况下,foo()
的返回值被放入$a
中。
文档中没有具体说明在这一点上要遵循什么规则,但我们可以推断出您的代码等效于以下内容:
$a && ($a = 1)
因为&&
是"懒惰的",因为如果它发现一个错误的参数,它就不会麻烦评估进一步的参数,这意味着$a
只有在它之前持有truthy值的情况下才会被设置为1
(在您的情况下,2
是truthy(。如果您设置了$a = 0
,那么它将保持为0
。
按照它的编写方式,你说的与这个相同
$a = 2;
if($a) $a = 1;
由于2
是东西,因此它成功并将$a
更改为1。
那么它为什么要这样做呢?您有一个声明$a = 2
;这里没有操作顺序,所以PHP处理它。操作顺序确实会在第二条语句中生效。记住,$a
是某种东西,(即真理(。让我们稍微更改一下你的代码
$a = 0;
$a && $a = 1;
echo $a;
正如您所看到的,$a
现在是伪造的。因此,该命令阻止脚本更改值,并且脚本输出0
$a && $a = 1;
是布尔类型的表达式。由于$a
是真的,因此表达式的求值将继续到第二部分,即赋值。作为分配的副作用,$a
现在保持1
。
如果$a
在开始时为0,那么它在结束时将保持0,因为表达式的求值将在测试第一个条件后立即终止。