我试图理解下面的代码,但我对&&操作符的使用感到困惑.
请&&在以下代码中解释操作的目的
function getErrors($autoClean=TRUE) {
$retVal = $this->getErrorMessages();
$autoClean && $this->unsetErrorMessages();
return $retVal;
}
Run Code Online (Sandbox Code Playgroud)
Rob*_*sen 30
$autoClean评估为true,$this->unsetErrorMessages() 将执行.$autoClean评估为false,$this->unsetErrorMessages() 将不会执行.使用||而不是&&反转这种行为.
显然,通过添加附加if语句也可以实现相同的行为.在这样做:
a && b() 可以改写为
if (a) {
b();
}
Run Code Online (Sandbox Code Playgroud)a || b() 可以改写为
if (!a) {
b();
}
Run Code Online (Sandbox Code Playgroud)虽然使用短路运算符可以减少行数,但也可能使代码难以读取.
在执行速度方面,应该没有明显的差异.
更新
我必须收回我之前关于执行速度没有明显差异的陈述.给出以下两个测试脚本,即带有短路运算符的版本:
<?php
$a = true;
function b() { global $a; $a = !$a; }
for ($i = 0; $i < 10000000; $i++) {
$a && b();
}
?>
Run Code Online (Sandbox Code Playgroud)
还有一个带if声明的版本:
<?php
$a = true;
function b() { global $a; $a = !$a; }
for ($i = 0; $i < 10000000; $i++) {
if($a) { b(); }
}
?>
Run Code Online (Sandbox Code Playgroud)
事实证明,在我的运行在Ubuntu 14.04 LTS(64位)上的PHP 5.5.9版本中,第二个版本(带if语句)大约快40%(约450毫秒对比约750毫秒).
对于不同的PHP版本和操作系统,结果可能会有所不同,但至少在我的机器上,我始终注意到执行速度的显着差异.
Ash*_*kla 15
在这里,&&作为@robby讲述的短路操作员.
该行为我们提供了一种防止任何代码默认执行的行为,并为我们提供了减少代码行的工具
$autoClean && $this->unsetErrorMessages();
Run Code Online (Sandbox Code Playgroud)
将等同于
if($autoClean){
$this->unsetErrorMessages();
}
Run Code Online (Sandbox Code Playgroud)