выполняется ли условие после && всегда - PullRequest
40 голосов
/ 29 марта 2010

У меня есть if утверждение, которое проверяет 2 условия ниже. Второе - это функция goodToGo(), поэтому я хочу вызвать ее, если только первое условие не выполнено

$value = 2239;

if ($value < 2000 && goodToGo($value)){
   //do stuff
}

function goodToGo($value){
   $ret = //some processing of the value
   return $ret; 
}

Мой вопрос касается условий 2, если $value < 2000 && goodToGo($value). Проходят ли они оба оценки, или только второе оценивается, когда первое верно?

Другими словами, являются ли следующие 2 блока одинаковыми?

if($value < 2000 && goodToGo($value)) {
   //stuff to do
}

if($value < 2000) {
    if (goodToGo($value)){
       //stuff to do
    }
}

Ответы [ 6 ]

77 голосов
/ 29 марта 2010

Нет - второе условие не всегда выполняется (что делает ваши примеры эквивалентными).

PHP операторы &&, ||, and и or реализованы как операторы "короткого замыкания". Как только найдено условие, которое вынуждает результат для общего условия, оценка последующих условий прекращается.

С http://www.php.net/manual/en/language.operators.logical.php

// --------------------
// 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());
6 голосов
/ 29 марта 2010

Да. Два блока одинаковы. PHP, как и большинство (но не все) языков, использует оценку короткого замыкания для && и ||.

3 голосов
/ 29 марта 2010

Два блока одинаковы.

Логические операторы PHP "ленивы", они оцениваются, только если они необходимы.Следующий код выводит «Hello, world!»:

<?php
$a = 10;
isset($a) || die ("variable \$a does not exist.");
print "Hello, world!"
?>

Другие логические операторы включают &&, и, или.

<?php
perform_action() or die ('failed to perform the action');
?>

- это популярная идиома.

2 голосов
/ 29 марта 2010

второе условие будет проверено только тогда и только тогда, когда первое условие истинно, следовательно, оба утверждения эквивалентны.

1 голос
/ 29 марта 2010

Да, 2 кодовых блока, которые вы дали, эквивалентны. PHP имеет короткое замыкание, поэтому при использовании || и &&, любое утверждение после первого вычисляется только при необходимости.

0 голосов
/ 29 марта 2010

Всегда соотносите свой технический язык со своим собственным языком, также здесь, если я скажу вам в устной беседе, это так: Вы спрашиваете = «Я голоден» && «Я ем пиццу» аналогичноЯ голоден, тогда только я ем пиццу "?Итак, здесь вы можете увидеть, что более поздняя фраза говорит, что пока я не голоден, я не ем пиццу, а первый говорит, что я бодрый и я ем пиццу.: -)

...