这里有一些开玩笑和误导性的评论,甚至部分不正确的答案信息。我想尝试改进它们:
首先,正如一些人所指出的,你的代码中有一个与问题相关的错误:
if ($status = 'clear' AND $pRent == 0)
应该是(注意在第一部分中代替):==
=
if ($status == 'clear' AND $pRent == 0)
在这种情况下,它在功能上等效于
if ($status == 'clear' && $pRent == 0)
其次,注意这些运算符()是短路运算符。这意味着,如果可以从第一个表达式中确定答案,则永远不会计算第二个表达式。同样,这对于上面的调试行无关紧要,但是当将这些运算符与赋值组合时,这一点非常重要,因为and or && ||
第三,和之间的真正区别在于它们的运算符优先级。具体而言,重要性在于其优先级高于赋值运算符 (),而优先级低于赋值运算符。因此,在结合使用赋值和逻辑计算的语句中,选择哪一个很重要。and or
&& ||
&& ||
= += -= *= **= /= .= %= &= |= ^= <<= >>=
and or
PHP页面关于逻辑运算符的修改示例:
$e = false || true;
将计算该值并将其赋值给 ,因为运算符优先级高于 ,因此它实质上是这样计算的:true
$e
||
=
$e = (false || true);
然而
$e = false or true;
将赋值给 (然后执行操作并计算 ),因为具有比 更高的运算符优先级,实质上是这样的计算:false
$e
or
true
=
or
($e = false) or true;
事实上,这种模糊性甚至存在,这使得许多程序员总是使用,然后一切都像人们在C这样的语言中所期望的那样清晰地工作,即。首先是逻辑运算,然后是赋值。&& ||
像Perl这样的一些语言经常以类似于这样的格式使用这种结构:
$connection = database_connect($parameters) or die("Unable to connect to DB.");
从理论上讲,这会将数据库连接分配给 ,或者如果失败(我们在这里假设该函数将返回在这种情况下评估的内容),它将以错误消息结束脚本。由于短路,如果数据库连接成功,则永远不会计算 。$connection
false
die()
一些允许这种结构的语言直接禁止在条件/逻辑语句中进行赋值(如Python),以相反的方式消除友好性。
PHP允许两者,所以你只需要了解一次你的两个选项,然后按照你想要的方式编码,但希望你能以某种方式保持一致。
每当有疑问时,只需添加一组额外的括号,即可消除所有歧义。这些将始终是相同的:
$e = (false || true);
$e = (false or true);
有了所有这些知识,我更喜欢使用,因为我觉得它使代码更具可读性。我只是有一个规则,不要将分配与逻辑评估结合起来。但在这一点上,这只是一种偏好,一致性在这里比你选择哪一方更重要。and or