else

经常需要在满足某个条件时执行一条语句,而在不满足该条件时执行其它语句,这正是 else 的功能。else 延伸了 if 语句,可以在 if 语句中的表达式的值为 FALSE 时执行语句。例如以下代码在 $a 大于 $b 时显示 a is bigger than b,反之则显示 a is NOT bigger than b

<?php
if ($a > $b) {
    echo
"a is bigger than b";
} else {
    echo
"a is NOT bigger than b";
}
?>

else 语句仅在 if 以及 elseif(如果有的话)语句中的表达式的值为 FALSE 时执行(参见 elseif)。


add a note add a note User Contributed Notes
mitch at mitchellbeaumont dot com
24-Jul-2007 07:09
At gwmpro at yahoo dot com

The curly brace is not required however, for readability and maintenance, many developers would consider it bad style not to include them.
robbak
21-Jun-2007 07:54
Yes, that code is clearly ambiguous. I would think that the code does the 'right thing' with it anyway. The else should bind to the nearest if.

If you are going to nest ifs, use curly brackets and stay sane.
<?
if ($a == 1)
{
/* nested if */
 
if ($b == 2) echo '2';
} else
 
/* other code */
?>
jsimlo
15-Aug-2006 02:30
This generates a parser error:

<?
if ($a == 1):
 
/* nested if */
 
if ($b == 2) echo '2';
else:
 
/* other code */
endif;
?>

The nested "if" binds the outer "else" and the colon then generates a parser error.

As this "bug" is not going to be fixed (see http://bugs.php.net/bug.php?id=838), this could be an artful solution to this problem:

<?
if ($a == 1):
 
/* nested if */
 
if ($b == 2) echo '2';
 
/* dummy expression */
 
;
else:
 
/* other code */
endif;
?>
gwmpro at yahoo dot com
04-May-2006 03:00
I am new to this language. It seems to me that only the semicolon ';' is required, the brackets '{}' are not if there is only one statement. The code segment below would be legal.

<?php
if ($a > $b)
   echo
"a is bigger than b";
else
   echo
"a is NOT bigger than b";

?>
Caliban Darklock
08-Nov-2004 07:24
If you're coming from another language that does not have the "elseif" construct (e.g. C++), it's important to recognise that "else if" is a nested language construct and "elseif" is a linear language 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 stack overflow error, but the level where this happens is ridiculous in real world terms. Nobody normally nests if() blocks to more than a thousand levels unless they're trying to break 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 process. 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.
cap at capsi dot com
06-Oct-2000 05:58
Often you can avoid large if/else statements in your code by using the ternary operator. For example:

<?php
echo "You have $i ". ($i==1 ? "message" : "messages"). " in your mailbox.\n";
?>