does the condition after && always get evaluated
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.
Related videos on Youtube
brett
Updated on January 15, 2020Comments
-
brett over 4 years
I have this
if
statement that tests for the 2 conditions below. The second one is a functiongoodToGo()
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 about 14 yearsI 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 istrue
, but looks like it's not the case. Good to know. -
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 about 14 yearsNow I am feeling Hungry :) But I dont eat Pizza