我正在尝试理解下面的代码,但我对使用&&
运算符感到困惑
请在以下代码中解释&&
操作的目的
function getErrors($autoClean=TRUE) {
$retVal = $this->getErrorMessages();
$autoClean && $this->unsetErrorMessages();
return $retVal;
}
答案 0 :(得分:30)
此处,&&
充当short-circuit运算符(另请参阅代码示例here)。
$autoClean
评估为 true
,则会{/ 1}} 执行。$this->unsetErrorMessages()
评估为 $autoClean
,则false
将不会执行。使用$this->unsetErrorMessages()
代替||
会改变此行为。
通过添加额外的&&
语句,显然也可以实现相同的行为。这样做:
if
可以改写为
a && b()
if (a) {
b();
}
可以改写为
a || b()
虽然使用短路运算符可以减少行数,但也可能使代码难以阅读。
就执行速度而言,应该没有明显的区别。
<强>更新强>
我必须撤回先前关于执行速度没有明显差异的陈述。给出以下两个测试脚本,即带有短路运算符的版本:
if (!a) {
b();
}
带有<?php
$a = true;
function b() { global $a; $a = !$a; }
for ($i = 0; $i < 10000000; $i++) {
$a && b();
}
?>
声明的版本:
if
事实证明,在我在Ubuntu上运行的PHP 5.5.9版本中,第二个版本(使用<?php
$a = true;
function b() { global $a; $a = !$a; }
for ($i = 0; $i < 10000000; $i++) {
if($a) { b(); }
}
?>
语句)大约快40%(~450ms与~750ms) 14.04 LTS(64位)。
不同的PHP版本和操作系统的结果可能会有所不同,但至少在我的机器上我始终注意到执行速度的显着差异。
答案 1 :(得分:15)
在这里,&&
充当了@robby所说的短路操作员。
该行为我们提供了防止任何代码默认执行的行为
并为我们提供减少代码行的工具
作为
$autoClean && $this->unsetErrorMessages();
将等同于
if($autoClean){
$this->unsetErrorMessages();
}