does the condition after && always get evaluated

13,011

Solution 1

No--the second condition won't always be executed (which makes your examples equivalent).

PHP's &&, ||, and, and or operators are implemented as "short-circuit" operators. As soon as a condition is found that forces the result for the overall conditional, evaluation of subsequent conditions stops.

From 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());

Solution 2

Yes. The two blocks are the same. PHP, like most (but not all) languages, uses short-circuit evaluation for && and ||.

Solution 3

The two blocks ARE same.

PHP logical operators are "lazy", they are evaluated only if they are needed. The following code prints "Hello, world!":

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

Other logical operators includes &&, and, or.

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

is a popular idiom.

Solution 4

the second condition will only be checked if and only if first one is true, hence both statements are equivalent.

Solution 5

Yes, the 2 code blocks you gave are equivalent. PHP has short-circuiting, so when you use || and &&, any statement after the first only gets evaluated when necessary.

Share:
13,011

Related videos on Youtube

brett
Author by

brett

Updated on January 15, 2020

Comments

  • brett
    brett over 4 years

    I have this if statement that tests for the 2 conditions below. The second one is a function goodToGo() so I want to call it unless the first condition is already true

    $value = 2239;
    
    if ($value < 2000 && goodToGo($value)){
       //do stuff
    }
    
    function goodToGo($value){
       $ret = //some processing of the value
       return $ret; 
    }
    

    My question is about the 2 if conditions $value < 2000 && goodToGo($value). Do they both get evaluated or does the second one only get evaluated when the first one is true?

    In other words, are the following 2 blocks the same?

    if($value < 2000 && goodToGo($value)) {
       //stuff to do
    }
    
    if($value < 2000) {
        if (goodToGo($value)){
           //stuff to do
        }
    }
    
  • brett
    brett about 14 years
    I chose this later answer because it brings up a really good point about (true || foo()). Would have thought the second one would evaluate since the first one is true, but looks like it's not the case. Good to know.
  • Matti
    Matti about 14 years
    @brett, Yeah--the key is that for OR, you know it's going to be TRUE the first time you find a TRUE--no number of FALSEs will change that. For AND, you know it's going to be FALSE the first time you find a FALSE--no number of TRUEs will change that.
  • OM The Eternity
    OM The Eternity about 14 years
    Now I am feeling Hungry :) But I dont eat Pizza