&& 运算符的异常使用

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();
}