Необычное использование оператора &&

Я пытаюсь понять приведенный ниже код, но меня смущает использование оператора &&.
Пожалуйста, объясните цель операции && в следующем коде

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

Ответы

Ответ 1

Здесь && действует как оператор короткого замыкания, как сказано в @robby.

  • Если вы вызываете getErrors(), $autoclean будет true, $this- > unsetErrorMessages() будет выполняется.
  • Если вы вызываете getErrors (false), $autoclean будет false, $this- > unsetErrorMessages() не будет выполняется.

Строка предоставляет нам поведение для предотвращения выполнения по умолчанию любого кода а также предоставляет нам возможность сократить количество строк кода а

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

будет эквивалентно

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

Ответ 2

Здесь && действует как оператор short-circuit (см. также пример кода здесь).

  • Если $autoClean оценивается как true, $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:

<?php
    $a = true;                                                                                                   

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

    for ($i = 0; $i < 10000000; $i++) {
        if($a) { b(); }
    }
?>

Оказалось, что вторая версия (с оператором if) примерно на 40% быстрее (~ 450 мс против ~ 750 мс) в моей версии PHP 5.5.9, запущенной на Ubuntu 14.04 LTS (64 бит).

Результаты могут отличаться для разных версий PHP и операционных систем, но, по крайней мере, на моей машине я постоянно замечаю существенную разницу в скорости выполнения.