php - && 运算符的异常使用

标签 php operators

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

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

最佳答案

在这里,&& 充当 short-circuit运算符(另请参见代码示例 here)。

  • 如果 $autoClean 的计算结果为 true$this->unsetErrorMessages() 被处决。
  • 如果 $autoClean 的计算结果为 false$this->unsetErrorMessages() 将不会 被处决。

使用 || 而不是 && 会逆转这种行为。

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

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

    if (a) {
        b();
    }
    
  • 一个|| 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(); }
    }
?>

事实证明,在我的 PHP 5.5.9 版本上,第二个版本(使用 if 语句)快了大约 40%(~450ms 对比 ~750ms)在 Ubuntu 14.04 LTS(64 位)上运行。

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

关于php - && 运算符的异常使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31847546/

相关文章:

c# - VB.Net 相当于 C# 中的 ^ 运算符

不同类型的 C++ 默认赋值运算符

ios - 如何在函数中将运算符作为参数传递?

c++ - 允许成员为 const,同时仍然支持类上的 operator=

php - 换行符在 textarea 中显示为\r\n

php - 使用我的 iphone 应用程序中的 php 将字符串(带空格)插入 mysql

php - 为登录用户 PHP MYSQL 添加异常或条件

php - 如何使用增量值更新列

php - SQL_CALC_FOUND_ROWS/FOUND_ROWS() 在 PHP 中不起作用

ruby - 如何在谷歌中搜索语言语法?