不正常使用&&运算符

Cod*_*kie 16 php operators

我试图理解下面的代码,但我对&&操作符的使用感到困惑.
&&在以下代码中解释操作的目的

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语句也可以实现相同的行为.在这样做:

虽然使用短路运算符可以减少行数,但也可能使代码难以读取.

在执行速度方面,应该没有明显的差异.


更新

我必须收回我之前关于执行速度没有明显差异的陈述.给出以下两个测试脚本,即带有短路运算符的版本:

<?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版本和操作系统,结果可能会有所不同,但至少在我的机器上,我始终注意到执行速度的显着差异.

  • 值得注意的是:等效的if语句可能会被视为更清晰的代码并且更容易被理解,即使它是3倍多的行.减少行数并不总是更好. (3认同)
  • 很好的答案._amber_,这也是`someStatement()或die();`模式[你可能在PHP的其他地方看到](http://stackoverflow.com/q/432454/1426891)背后的解释. (3认同)

Ash*_*kla 15

在这里,&&作为@robby讲述的短路操作员.

  • 如果调用getErrors(),$ autoclean将为true,将执行$ this-> unsetErrorMessages().
  • 如果调用getErrors(false),$ autoclean将为false,$ this-> unsetErrorMessages()将不会被执行.

该行为我们提供了一种防止任何代码默认执行的行为,并为我们提供了减少代码行的工具

$autoClean && $this->unsetErrorMessages();
Run Code Online (Sandbox Code Playgroud)

将等同于

if($autoClean){
   $this->unsetErrorMessages();
}
Run Code Online (Sandbox Code Playgroud)

  • @AshwaniShukla这个案例与优化没什么关系,它最好是混淆(最常见的是愚蠢). (13认同)
  • 值得注意的是:if语句可能会被视为更清晰的代码并且更容易被理解,即使它是3倍的行数.减少行数并不总是更好. (9认同)
  • @AshwaniShukla足够公平,我主要用于编译语言.至少评论会对不熟悉该语言成语的人有所帮助. (2认同)
  • @AshwaniShukla你几乎无法优化PHP代码,因为PHP本身在后台优化了很多. (2认同)