Если первый аргумент сбудется в условии с и операторы будет следующий запуск? - PullRequest
5 голосов
/ 28 апреля 2011

Допустим, у меня есть кусок кода, который выглядит следующим образом:

if( !isset($this->domainID) && !$this->getDomainID() ){
    return false;
}

Будет ли выполнено 2-е утверждение, если первое верно?Потому что с точки зрения производительности было бы глупо получить ID из базы данных, если я его уже получил, и есть много других ситуаций, где применяется то же самое.Если бы не пришлось их вкладывать, я прав?

Я не знаю, есть ли стандарт того, как работает язык программирования в этих случаях, или он отличается от других языков, чем php.Я попытался погуглить, но я не знал, что искать в этом случае.Как вы видите, я довольно трудно описал это в заголовке.

Ответы [ 4 ]

15 голосов
/ 28 апреля 2011

Да.Если первое верно, второе будет оценено.И наоборот, если первое неверно, второе не будет оцениваться.Это может быть хорошим местом для микрооптимизаций и, как вы отметили, логической прогрессии.

Согласно комментариям, обратное верно для условий ORПоэтому, если первое выражение ложно, следующее будет оценено, а если первое выражение истинно, следующее не будет.

3 голосов
/ 28 апреля 2011

Ответ - да, вы можете увидеть это сами, выполнив что-то вроде этого:

#!/usr/bin/php                                                                  
<?PHP
function test1() {
    echo "inside test1\n";
    return false;
}
function test2() {
    echo "inside test2\n";
    return true;
}
echo "test1 first AND test2 second\n";
if (test1() && test2()) {
    echo "both passed\n";
}
echo "test2 first AND test1 second\n";
if (test2() && test1()) {
    echo "both passed\n";
}
echo "test1 first OR test2 second\n";
if (test1() || test2()) {
    echo "one passed\n";
}
echo "test2 first OR test1 second\n";
if (test2() || test1()) {
    echo "one passed\n";
}
?>
2 голосов
/ 28 апреля 2011

Нет, если первое неверно, второе не будет оцениваться.

То, о чем вы на самом деле говорите, это «ленивая оценка». Он часто используется в функциональных языках программирования и может значительно улучшить время выполнения. Смотрите здесь для получения дополнительной информации: http://en.wikipedia.org/wiki/Lazy_evaluation

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

0 голосов
/ 28 апреля 2011

Да, вы используете AND, поэтому оба условия будут проверены, если первое верно (но не если первое неверно).

Если вы использовали OR и первое условие было истинным, php не оценил бы второе.

...