流程控制的替代语法

PHP 提供了一些流程控制的替代语法,包括 ifwhileforforeachswitch。替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成 endif;endwhile;endfor;endforeach; 以及 endswitch;

<?php if ($a == 5): ?>
A is equal to 5
<?php endif; ?>

在上面的例子中,HTML 内容“A is equal to 5”用替代语法嵌套在 if 语句中。该 HTML 的内容仅在 $a 等于 5 时显示。

替代语法同样可以用在 elseelseif 中。下面是一个包括 elseifelseif 结构用替代语法格式写的例子:

<?php
if ($a == 5):
    echo
"a equals 5";
    echo
"...";
elseif (
$a == 6):
    echo
"a equals 6";
    echo
"!!!";
else:
    echo
"a is neither 5 nor 6";
endif;
?>

更多例子参见 whileforif


add a note add a note User Contributed Notes
atw
04-Nov-2006 08:47
As "qbolec" states, all the notes below which use the "?" are actually references to the ternary operator (http://uk.php.net/operators.comparison").

Whilst this is kind of relevent, it probably shouldn't be in this section.
qbolec
16-Oct-2006 05:33
I don't find some of the previous posts to be referencing this particular article.
? operator (although it has something to do with conditions) has nothing to do with alternative syntax for control structures, which influence order of executing statements, as opposed to computing values.
Neil
30-Sep-2006 03:08
as skippy noted above this is very useful stuff for interspersed php & html. Here is alternative syntax example using a bitwise comparison to set checkboxes on and off to prefill a permissions bitmask calculator form:
<?
$bitmask
= 481683;
?>
.... [yada yada yada]....
<input type="checkbox" name="SOME_PERMISSION_VARIABLE" value="32768" <? echo($bitmask & 32768 ? "checked" : ""); ?>>Can perform some operation<br/>
<input type="checkbox" name="SOME_OTHER_PERMISSION_VARIABLE" value="65536" <? echo($bitmask & 65536 ? "checked" : ""); ?>>Can perform some other operation<br/>

You supply a bitmask, and it prechecks all the permissions the user has so you don't need to remember what they already have to recheck them all individually.

It's much more elegant than traditional if's.
davidforest at gmail dot com
20-Oct-2005 09:26
If you need a tidy way to do a lot of condition testing, switch statement will do the job well:

switch (true){

   case ($a>0):
                     //do sth;
                     break;
   case ($b>0):
                     //do sth;
                     break;
   case ($c>0):
                     //do sth;
                     break;
   case ($d>0):
                     //do sth;
                     break;

}
skippy at zuavra dot net
27-Jun-2005 07:32
If it needs saying, this alternative syntax is excellent for improving legibility (for both PHP and HTML!) in situations where you have a mix of them.

Interface templates are very often in need of this, especially since the PHP code in them is usually written by one person (who is more of a programmer) and the HTML gets modified by another person (who is more of a web designer). Clear separation in such cases is extremely useful.

See the default templates that come with WordPress 1.5+ (www.wordpress.org) for practical and smart examples of this alternative syntax.
siebe-tolsma at home dot nl
19-Mar-2004 02:22
As a rection on sttoo, if you use nested if's a bit different they are less likely to cause mistakes:
[EDITOR'S NOTE: Referenced Note has been removed]

<?php
$one
= true;
$two = true;

$result = ($one ? "one" : ($two ? "two" : "none"));    // $result is "one"

$one = false;
$result = ($one ? "one" : ($two ? "two" : "none"));    // $result is "two"

$two = false;
$result = ($one ? "one" : ($two ? "two" : "none"));    // $result is "none"

?>
i a m 4 w e b w o r k at hotmail dot com
13-Oct-2003 07:38
Good tutorial on using alternative control structure syntax at:
http://www.onlamp.com/pub/a/php/2001/05/03/php_foundations.html?page=1
paul at example dot com
06-Sep-2003 09:27
There is an other alternative syntax:

<?php
if ($a > 5) {
   echo
"big";
} else {
   echo
"small";
}
?>

can be replaced by:

<?php
echo $a > 5 ? "big" : "small";
?>