回答

3

经过一番搜索,我发现这是由operator precedence in PHP.引起的'='运算符比'and'更强。

如果你想让你必须使用括号预期的结果:

$x = (true and false); //correct: $x is false now! 

如果没有括号中的表达式等于($x = true) and false;。 $ x将获得'真正'的价值。之后,PHP解释器用$ x刚刚获得的值“替换”此赋值。所以true and false;仍然存在。而这没有任何作用。 '假'丢失,并没有影响表达。

请注意,如果您使用'& &'或'||',则不需要大括号!它们比“=”更强,因此比“和”和“或”更强。奇怪...

这与例如$x = 5 + 6;因为这里'+'比'='强,它会首先被解决。最后,它只影响布尔运算符'和','或'和'xor'。只有与他们在一起,你必须小心。

还请注意,与JavaScript或Java等其他语言相比,这是不同的。在这些语言中,由于逻辑运算符强于等号运算符(Operators in JavaScript,Operators in Java),因此不需要大括号。

+0

所以基本上[this](http://php.net/manual/en/language.operators.precedence.php)。 – 2015-03-13 13:04:54

+0

@AndreiP。是。我花了一段时间才发现,因为我正在考虑Java ... – robsch 2015-03-13 13:07:42

+0

你发布这个问题之前你知道答案吗?两者都有相同的时间戳。 – 2015-03-13 13:13:16

0

更多内容:

$x = true and false; 

因此,我们有以下。如果你猜$x是真的,你会是对的。由于=and有更高的先例。

重写表达上述这将是等于这个:

($x = true) and false; 

在此处,它变得有趣。

如果你做的事:

$x = true && false; 

,你猜那$x是真的,你就错了。在这种情况下,$x实际上是错误的。

上述表达式实际上等于:

$x = (true and false); 

为什么呢?因为&&and有更高的先例。