Php 不寻常地使用&&;操作人员

Php 不寻常地使用&&;操作人员,php,operators,Php,Operators,我试图理解下面的代码,但我对&&运算符的使用感到困惑。 请在以下代码中解释&操作的目的 function getErrors($autoClean=TRUE) { $retVal = $this->getErrorMessages(); $autoClean && $this->unsetErrorMessages(); return $retVal; } 这里,&&充当操作符(另请参见代码示例) 如果$autoClean的计算结果为

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

function getErrors($autoClean=TRUE) {
     $retVal = $this->getErrorMessages();
     $autoClean && $this->unsetErrorMessages();
     return $retVal;
}

这里,
&&
充当操作符(另请参见代码示例)

  • 如果
    $autoClean
    的计算结果为
    true
    ,将执行
    $this->unsetErrorMessages()
  • 如果
    $autoClean
    的计算结果为
    false
    $this->unsetErrorMessages()
    将不会执行
使用
|
而不是
&&
将扭转这种行为

同样的行为显然也可以通过添加额外的
if
语句来实现。在这样做时:

  • a&&b()
    可以重写为

    if (a) {
        b();
    }
    
    if (!a) {
        b();
    }
    
  • a | | b()
    可以重写为

    if (a) {
        b();
    }
    
    if (!a) {
        b();
    }
    
虽然使用短路运算符可以减少行数,但也会使代码更难阅读

在执行速度方面,应该没有明显的区别


更新

我不得不收回我先前关于执行速度没有明显差异的说法。给定以下两个测试脚本,即带有短路操作员的版本:

<?php
    $a = true;                                                                                                   

    function b() { global $a; $a = !$a; }

    for ($i = 0; $i < 10000000; $i++) {
        $a && b();
    }
?>
事实证明,第二个版本(带有
if
语句)在我的运行于Ubuntu 14.04 LTS(64位)上的PHP5.5.9版本上大约快了40%
(~450ms vs.~750ms)


对于不同的PHP版本和操作系统,结果可能会有所不同,但至少在我的机器上,我始终注意到执行速度的显著差异

在这里,
&&
就像@robby所说的那样充当短路操作员

  • 如果调用getErrors(),$autoclean将为true,$this->unsetErrorMessages()将为true 执行
  • 如果调用getErrors(false),$autoclean将为false,$this->unsetErrorMessages()将不为false 执行
该行为我们提供了一种行为来防止任何代码的默认执行 并且还为我们提供了减少代码行的便利 作为

相当于

if($autoClean){
   $this->unsetErrorMessages();
}

您也可以使用字面单词
例如
if((true或true)和true)
基本上它是根据短路原理工作的。如果是or(cnd1 | | cnd2),如果cnd1==true,它将使操作短路,永远不会进行cnd2。类似地,for和只在cnd1为真时才检查cnd2。值得注意的是:等价的if语句可能会被视为更干净的代码,更容易理解,即使它的行数是cnd1的3倍。少线并不总是好的。回答得好。amber,这也是
someStatement()或die()背后的解释模式。仅从内部角度注意,第一个操作需要一个隐式布尔强制转换[在第二个操作数上]和and操作,这在执行
if($a){…}
时是不需要的,这使得第一个代码的速度变慢了。值得注意的是:if语句可能会被视为更干净、更容易理解的代码,尽管它的行数是原来的3倍。行数越少并不总是越好。@AshwaniShukla很公平,我主要习惯于编译语言。至少一条评论对不熟悉该语言习惯用法的人是有帮助的。@AshwaniShukla这个案例与优化无关,充其量只是混淆(很可能是常见的愚蠢行为)@AshwaniShukla由于PHP本身在后台进行了大量优化,因此您几乎无法对PHP代码进行优化。我怀疑大多数编译器是否会对这两个语句产生影响,我也严重怀疑这种差异是否会导致速度的明显提高。不管是哪种方式,我认为对编译器(或解释器,ftm)进行二次猜测对于琐碎的事情都不是一个好主意。谢谢你的回复。它起作用了。。。。。。。。。。。。