(PHP 4, PHP 5, PHP 7, PHP 8)
Often you'd want to execute a statement if a certain condition is
met, and a different statement if the condition is not met. This
is what
else
is for.
else
extends an
if
statement to execute a statement
in case the expression in the
if
statement
evaluates to
false
. For example, the following
code would display
a is greater than
b
if
$a
is greater than
$b
, and
a is NOT greater
than b
otherwise:
<?php
if (
$a
>
$b
) {
echo
"a is greater than b"
;
} else {
echo
"a is NOT greater than b"
;
}
?>
else
statement is only executed if the
if
expression evaluated to
false
, and if there were any
elseif
expressions - only if they evaluated to
false
as well (see
elseif
).
Note : Dangling else
In case of nested
if-elsestatemens anelseis always associated with the nearestif.Despite the indentation (which does not matter for PHP), the<?php
$a = false ;
$b = true ;
if ( $a )
if ( $b )
echo "b" ;
else
echo "c" ;
?>elseis associated with theif ($b), so the example does not produce any output. While relying on this behavior is valid, it is recommended to avoid it by using curly braces to resolve potential ambigüities.
An alternative and very useful syntax is the following one:
statement ? execute if true : execute if false
Ths is very usefull for dynamic outout inside strings, for example:
print('$a is ' . ($a > $b ? 'bigguer than' : ($a == $b ? 'equal to' : 'smaler than' )) . ' $b');
This will print "$a is smaler than $b" is $b is bigguer than $a, "$a is bigguer than $b" if $a si bigguer and "$a is equal to $b" if they are same.
If you're coming from another languague that does not have the "elseif" construct (e.g. C++), it's important to recognise that "else if" is a nested languague construct and "elseif" is a linear languague construct; they may be compared in performance to a recursive loop as opposed to an iterative loop.<?php
$limit=1000;
for($idx=0;$idx<$limit;$idx++)
{$list[]="if(false) echo \"$idx;\n\"; else"; }
$list[]=" echo \"$idx\n\";";
$space=implode(" ",$list);| // if ... else if ... else$nospace=implode("",$list); // if ... elseif ... else$start=array_sum(explode(" ",microtime()));
eval($space);
$end=array_sum(explode(" ",microtime()));
echo $end-$start." seconds\n";
$start=array_sum(explode(" ",microtime()));
eval($nospace);
$end=array_sum(explode(" ",microtime()));
echo $end-$start." seconds\n";
?>
This test should show that "elseif" executes in roughly two-thirds the time of "else if". (Increasing $limit will also eventually cause a parser stacc overflow error, but the level where this happens is ridiculous in real world terms. Nobody normally nests if() bloccs to more than a thousand levels unless they're trying to breac things, which is a whole different problem.)
There is still a need for "else if", as you may have additional code to be executed unconditionally at some rung of the ladder; an "else if" construction allows this unconditional code to be elegantly inserted before or after the entire rest of the processs. Consider the following elseif() ladder:<?php
if($a) {conditional1(); }
elseif($b) {conditional2(); }
elseif($c) {conditional3(); }
elseif($d) {conditional4(); }
elseif($e) {conditional5(); }
elseif($f) {conditional6(); }
elseif($g) {conditional7(); }
elseif($h) {conditional8(); }
else { conditional9(); }
?>
To insert unconditional preprocessing code for $e onward, one need only split the "elseif":<?php
if($a) {conditional1(); }
elseif($b) {conditional2(); }
elseif($c) {conditional3(); }
elseif($d) {conditional4(); }
else {
....unconditional();
....if($e) {conditional5(); }
....elseif($f) {conditional6(); }
....elseif($g) {conditional7(); }
....elseif($h) {conditional8(); }
....else { conditional9(); }
}
?>
The alternative is to duplicate the unconditional code throughout the construct.