Почему это работает: if (isset ($ var) && $ var) { - PullRequest
4 голосов
/ 21 декабря 2009

Допустим, у меня есть переменная $ var, которая не была определена. Почему я не получаю ошибки с этим утверждением:

if ( isset($var) && $var ){
    // something
} else {
    // do something else
}

Как проверить, является ли что-то истинным или нет "&& $ var", если оно еще не установлено? Делает ли isset () что-то с оператором if. Конечно, это должно вернуться:

Notice: Undefined variable:$var

Ответы [ 8 ]

14 голосов
/ 21 декабря 2009

Когда первая часть оператора if не выполняется, остальная часть не оценивается, так как весь оператор не может быть истинным. Только если часть isset верна, выполнение достигает вашего оператора $ var.

Это стандартная языковая функция, которая характерна для большинства языков программирования.

Она называется «Оценка короткого замыкания», и вы можете узнать больше об этом в Википедии здесь: http://en.wikipedia.org/wiki/Short-circuit_evaluation

2 голосов
/ 21 декабря 2009

Это из-за оценки короткого замыкания .

Это означает, что если первые параметры для оператора && имеют значение false, нет необходимости оценивать второй параметр.

1 голос
/ 21 декабря 2009

Другие уже отметили, что оператор && ленив. Но есть еще один момент в этом вопросе:

Если переменная не определена в PHP, интерпретатор обрабатывает ее, как если бы она имела значение null. PHP на самом деле не волнует. И поскольку null само обрабатывается как логическое false, приведенное выше становится допустимым (логическим) выражением.

<?php

  if( $var ) {
     echo "something";
  } else {
     echo "nothing";
  }

не вызовет исключение, а просто выдаст эхо nothing, если $var не определено.

1 голос
/ 21 декабря 2009

&& является оператором короткого замыкания . Это означает, что остальная часть выражения не будет обработана, если первая половина выражения вернет false. Из-за этого $ var никогда не обрабатывается, чтобы определить, определен он или нет.

1 голос
/ 21 декабря 2009

Это потому, что когда isset() возвращает false, остальная часть оператора if не оценивается. Порядок, в котором вводятся 2 части оператора if, так что ваш код работает. Вы пытались повернуть оператор if следующим образом:

if ($var && isset($var))
{
  // something
}

Это должно закончиться неудачей.

0 голосов
/ 21 декабря 2009

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

В вашем примере isset($var) возвращает false. Поскольку оператор && определен так, что он истинен, только если все его подвыражений верны, это означает, что он не может быть истиной, если левое подвыражение ложно. Следовательно, правильное подвыражение не будет оценено (и не вызовет ошибку).

Оценка короткого замыкания очень полезна, поскольку вы можете объединить подвыражение, которое может привести к ошибке времени выполнения, с другим, которое гарантирует, что этого не произойдет. Примером является тот, который вы дали. Другие языки часто используют аналогичную конструкцию для конструкций null-save , например if (foo != null && foo.bar == 1) в Java или C # - foo.bar вызовет исключение, если foo будет нулевым, но достоинства оценки короткого замыкания гарантируют, что это никогда не будет оценено.

0 голосов
/ 21 декабря 2009

Это обычная оптимизация интерпретатора / компилятора с && (и) выражением, которое будет оцениваться до одной части выражения, если ложно. С || (или) выражение будет оцениваться до тех пор, пока одна часть не станет истинной.

Помните, что:

false && ?? => false
true && true => true
true && false => false

true || ?? => true
false || true => true
false || false => false
0 голосов
/ 21 декабря 2009

Оператор && имеет короткое замыкание. Это означает, что в выражении типа a && b b не будет оцениваться, если a равно false. Таким образом, в вашем примере, когда isset($var) ложно, часть && $var игнорируется.

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