Обработка php 'if x && y' - PullRequest
       1

Обработка php 'if x && y'

3 голосов
/ 08 августа 2011

Мне было интересно, как php обрабатывает операторы if.Если бы у меня было что-то вроде:

if (isset($_GET['foo']) && $_GET['foo'] != $bar)

Если foo не установлено, то оно сразу выпало бы из if (так как это оператор 'и', чтобы он мог 'в любом случае это не удастся) или это будет также проверять вторую часть, довольно бессмысленно?

Ответы [ 8 ]

4 голосов
/ 08 августа 2011

То, что вы описываете, называется «оценкой короткого замыкания».

Большинство языков работают таким образом, включая PHP, поэтому они будут оценивать выражение до тех пор, пока не будут уверены в результате, а затем останавливаются, поэтому остаток выражения не будет оцениваться.

Как вы говорите, это самый эффективный подход.

Тем не менее, он потенциально может бросить гаечный ключ в работу для неопытных программистов, которые могут попробовать что-то вроде этого:

if(doFirstProcess() && doSecondProcess() {
    print "both processes succeeded";
}

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

Есть несколько языков, которые не выполняют оценку короткого замыкания. VB6 был одним из примеров (в те времена). Я не знаю о VB.Net, но, поскольку он эволюционировал из VB6, я подозреваю, что он будет похожим. Но кроме этого, все другие языки, с которыми я работал, использовали оценку короткого замыкания, включая PHP.

Здесь в руководстве по PHP есть раздел об этом: http://www.php.net/manual/en/language.operators.logical.php

А вы можете прочитать больше об оценке короткого замыкания здесь: http://en.wikipedia.org/wiki/Short-circuit_evaluation

Надеюсь, это поможет.

3 голосов
/ 08 августа 2011

Это называется коротким замыканием:

  • && и and операторы выполняются слева направо
  • Если левая сторона считается false, нет причин проверять правую сторону, поэтому она пропущена, ложные возвращенные операторы

  • || и or выполняются также слева направо

  • Если левая сторона считается true, то нет причин проверять правую сторону, поэтому она пропущена, возвращено значение true

Ручной пример :

// foo() will never get called as those operators are short-circuit

$a = (false && foo());
$b = (true  || foo());
$c = (false and foo());
$d = (true  or  foo());
2 голосов
/ 08 августа 2011

он оставит оператор if после того, как первое выражение оценивается как ложное, потому что это утверждение никогда не может быть истинным, если первое выражение ложно, и они объединяются через AND

, вы можете проверить это очень легко.Если бы это не было так, как я сказал, вы получите уведомление, что $_GET['foo'] не определено

0 голосов
/ 08 августа 2011

Если первая проверка if (isset($_GET['foo']) возвращает ложь, вторая часть даже не будет рассматриваться.

0 голосов
/ 08 августа 2011

&& делает короткое замыкание (то есть возвращает ложь, как только одно условие не выполняется).

Если этого не произойдет, то наличие isset будет бессмысленным - оно существует для предотвращения ошибок, когдапытается сравнить неопределенное значение со строкой.

0 голосов
/ 08 августа 2011

выйдет после первого заявления. Вы можете проверить это:

напечатает 1:

if(1==1 && $a=1 == 1){

}
print $a;

Не будет печатать вещь:

if(1==2 && $a=1 == 1){

}
print $a;
0 голосов
/ 08 августа 2011

Некоторые операторы, прежде всего && и ||, являются так называемыми операторами короткого замыкания, что означает, что если результат операции ясен из первого операнда (false или true, соответственно),второй операнд не оценивается.

Редактировать: Кроме того, гарантируется, что операнды будут оцениваться по порядку, что не всегда верно для других операторов.

0 голосов
/ 08 августа 2011

Если первая часть ложна, останавливается if.

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