不寻常地使用&&操作者

时间:2015-08-06 05:34:35

标签: php operators

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

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

2 个答案:

答案 0 :(得分:30)

此处,&&充当short-circuit运算符(另请参阅代码示例here)。

  • 如果$autoClean评估为 true ,则会{/ 1}} 执行
  • 如果$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

事实证明,在我在Ubuntu上运行的PHP 5.5.9版本中,第二个版本(使用<?php $a = true; function b() { global $a; $a = !$a; } for ($i = 0; $i < 10000000; $i++) { if($a) { b(); } } ?> 语句)大约快40%(~450ms与~750ms) 14.04 LTS(64位)。

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

答案 1 :(得分:15)

在这里,&&充当了@robby所说的短路操作员。

  • 如果你调用getErrors(),$ autoclean将为true,$ this-&gt; unsetErrorMessages()将是 执行。
  • 如果你调用getErrors(false),$ autoclean将为false,$ this-&gt; unsetErrorMessages()将不会 执行。

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

$autoClean && $this->unsetErrorMessages();

将等同于

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