这是代码
$a = 2;
$a && $a = 1;
var_dump( $a ); // result 1
为什么$ a是1?
根据该文件,逻辑运营商'&&&优先级高于赋值运算符,它应解释为($ a&& $ a)= 1,然后应该有语法错误。
答案 0 :(得分:5)
注意:强>
虽然=
的优先级低于大多数其他运算符,但PHP仍然允许使用类似于以下内容的表达式:if (!$a = foo())
,在这种情况下,foo()
的返回值将放入$a
}。
文档没有说明此时遵循的规则,但我们可以推断出您的代码与此相同:
$a && ($a = 1)
因为&&
是"懒惰"因为如果它发现了一个错误的话,它就不会对进一步的论点进行评估,这意味着$a
如果以前只有1
,那么它将被设置为2
。你的情况,$a = 0
是真实的。如果您已设置0
,那么它将保留{{1}}。
答案 1 :(得分:2)
它写的方式,你说的是与此相同的东西
$a = 2;
if($a) $a = 1;
由于2
某事,它会成功并将$a
更改为1.
那么为什么会这样呢?你有$a = 2
的陈述;这里没有操作顺序,所以PHP处理它。操作顺序将在第二个声明中生效。请记住,$a
是SOMETHING,(即真实的)。我们稍微改变你的代码
$a = 0;
$a && $a = 1;
echo $a;
如你所见,$a
现在是假的。因此,顺序会阻止脚本更改值,脚本输出0
答案 2 :(得分:0)
$a && $a = 1;
是布尔类型的表达式。由于$a
是真实的,表达式的评估继续到第二部分,即赋值。作为作业的副作用,$a
现在保留1
。
如果$a
在开始时为0,那么最后它将保持为0,因为在测试第一个条件后,表达式的评估将立即终止。