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)进行二次猜测对于琐碎的事情都不是一个好主意。谢谢你的回复。它起作用了。。。。。。。。。。。。