&& 运算符的异常使用
Unusual use of && operator
我试图理解下面的代码,但我对 &&
运算符的使用感到困惑。
请解释一下下面代码&&
操作的目的
function getErrors($autoClean=TRUE) {
$retVal = $this->getErrorMessages();
$autoClean && $this->unsetErrorMessages();
return $retVal;
}
在这里,&&
充当 short-circuit operator (see also the code example here).
- 如果
$autoClean
的计算结果为true
,$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
语句的版本:
<?php
$a = true;
function b() { global $a; $a = !$a; }
for ($i = 0; $i < 10000000; $i++) {
if($a) { b(); }
}
?>
事实证明,第二个版本(使用 if
语句)在我的 PHP Ubuntu 14.04 LTS(64 位)上的 5.5.9 版本 运行。
不同 PHP 版本和操作系统的结果可能会有所不同,但至少在我的机器上,我始终注意到执行速度存在显着差异。
在这里,&&
充当@robby 所说的短路运算符。
- 如果调用 getErrors(),$autoclean 将为 true,$this->unsetErrorMessages() 将为
已执行。
- 如果调用 getErrors(false),$autoclean 将为 false,$this->unsetErrorMessages() 则不会
已执行。
该行为我们提供了防止默认执行任何代码的行为
并且还为我们提供了减少代码行的便利
作为
$autoClean && $this->unsetErrorMessages();
将等同于
if($autoClean){
$this->unsetErrorMessages();
}
我试图理解下面的代码,但我对 &&
运算符的使用感到困惑。
请解释一下下面代码&&
操作的目的
function getErrors($autoClean=TRUE) {
$retVal = $this->getErrorMessages();
$autoClean && $this->unsetErrorMessages();
return $retVal;
}
在这里,&&
充当 short-circuit operator (see also the code example here).
- 如果
$autoClean
的计算结果为true
,$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
语句的版本:
<?php
$a = true;
function b() { global $a; $a = !$a; }
for ($i = 0; $i < 10000000; $i++) {
if($a) { b(); }
}
?>
事实证明,第二个版本(使用 if
语句)在我的 PHP Ubuntu 14.04 LTS(64 位)上的 5.5.9 版本 运行。
不同 PHP 版本和操作系统的结果可能会有所不同,但至少在我的机器上,我始终注意到执行速度存在显着差异。
在这里,&&
充当@robby 所说的短路运算符。
- 如果调用 getErrors(),$autoclean 将为 true,$this->unsetErrorMessages() 将为 已执行。
- 如果调用 getErrors(false),$autoclean 将为 false,$this->unsetErrorMessages() 则不会 已执行。
该行为我们提供了防止默认执行任何代码的行为
并且还为我们提供了减少代码行的便利
作为
$autoClean && $this->unsetErrorMessages();
将等同于
if($autoClean){
$this->unsetErrorMessages();
}