Если первый аргумент принимает значение true в условии с операторами and, будет ли выполняться следующий?

#php #conditional-statements

#php #условные операторы

Вопрос:

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

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

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

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

Ответ №1:

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

Согласно комментариям, обратное верно для условий OR. Итак, если первое выражение равно false, будет вычислено следующее, а если первое выражение равно true, то следующее не будет.

Комментарии:

1. Спасибо, и я полагаю, что это то же самое, но обратное для OR || , и то же самое верно для большего количества операторов, чем 2, верно?

2. Да, обратная логика for ИЛИ и те же правила независимо от количества выражений.

Ответ №2:

Нет, если первое значение равно false, то второе вычисляться не будет.

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

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

Комментарии:

1. Я бы сказал, это можно рассматривать как отложенную оценку, но чаще это называют [оценкой короткого замыкания] [1]. [1] en.wikipedia.org/wiki/Short-circuit_evaluation

2. Спасибо за ссылку, сначала я был смущен вашим ответом, поскольку на первый взгляд кажется, что он противоречит другим ответам, но, прочитав его, я понял, что вы в основном сказали то же самое, просто с некоторой дополнительной информацией. Редактировать: Спасибо за ссылку, phimuemue, полезно узнать об этом больше, поскольку я часто переключаю языки и чем функция может отличаться.

3. Нет проблем, стоит немного узнать о отложенном вычислении. Через 10 лет это будет довольно стандартным среди лучших языков программирования.

Ответ №3:

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

 #!/usr/bin/php                                                                  
<?PHP
function test1() {
    echo "inside test1n";
    return false;
}
function test2() {
    echo "inside test2n";
    return true;
}
echo "test1 first AND test2 secondn";
if (test1() amp;amp; test2()) {
    echo "both passedn";
}
echo "test2 first AND test1 secondn";
if (test2() amp;amp; test1()) {
    echo "both passedn";
}
echo "test1 first OR test2 secondn";
if (test1() || test2()) {
    echo "one passedn";
}
echo "test2 first OR test1 secondn";
if (test2() || test1()) {
    echo "one passedn";
}
?>
  

Ответ №4:

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

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