Необычное использование оператора &&
Я пытаюсь понять приведенный ниже код, но меня смущает использование оператора &&
.
Пожалуйста, объясните цель операции &&
в следующем коде
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
. При этом:
Хотя использование операторов короткого замыкания может уменьшить количество строк, оно также может сделать код более трудным для чтения.
С точки зрения скорости выполнения не должно быть заметной разницы.
Обновление
Мне нужно отменить мое предыдущее выражение о том, что нет заметной разницы в скорости выполнения. Учитывая следующие два тестовых сценария, то есть версию с оператором короткого замыкания:
<?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 и операционных систем, но, по крайней мере, на моей машине я постоянно замечаю существенную разницу в скорости выполнения.