流程控制的替代语法

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
09-May-2006 05:51
matheo's example is the classic act of using a hammer to set a screw.  (No offense...)

As programmers, we <b>must</b> become comfortable that the result of a logic-expression <i>is a value</i> just like any other.

Therefore instead of:

<?php
$a
= 1 ;
$b = 2 ;
$is_a_bigger = ($a > $b) ? 1 : 0 ;
echo
$a_is_bigger ;
# returns 0
?>

Use this:

<?php
$a
= 1;
$b = 2;
$a_is_bigger = $a > $b;
...
?>

You read it as "variable $a_is_bigger is set to the result of the comparison of $a to $b".  Compare that to the read-thru of the upper example: "variable $is_a_bigger is set to true if the is-greater comparison of $a to $b is true, and set to false if the comparison is false."  How redundant.  The only thing more redundant is the ever increasingly popular 'duh' logic of today's <i>modern</i> PHP programming:

<?php
   $a
= 1;
  
$b = 2;
   if(
$a > $b )
   {
      
$a_is_bigger = true ;
   }
   else if(
$b >= $a )
   {
      
$a_is_bigger = false ;
   }
?>

8 lines to do what one simple construction can do ... which if we <i>learn to recognize it</i> vastly speeds the reading and appreciation of the purpose of the arbitrary algorithm.

The <b>only constructive criticism</b> that I've heard about the use of both ternary operators and logic-evaluation-direct-assign is that neither of them are easy to debug by adding 'prints' or 'echos' to their interiors.  Point well made.  Yet, if they are as simple as the above examples, it must be argued that the use of 8 lines to accomplish what a single comparison-assignment could do may well have resulted in more potential errors.  (For instance, did I remember to put the '=' in the second comparison as the exact compliment of the first?)

rlynch AT lynchmarks DOT com
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.
groundzero at 0845 dot uk dot com
19-May-2005 04:04
Person below...

paul at example dot com didnt say its was a replacement, or exactly the same as the if statement. He just gave a piece of code that, in this case had the same effect.
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:

<?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"

?>
ssttoo at hotmail dot com
06-Dec-2003 09:20
Nested ternary operators can be used, although not a "good programming practice", as it does not promote readability and is prone to errors.

<?php
$one
= true;
$two = true;
$result = ($one) ? "one" : (($two) ? "two" : "none");    // $result is "one"
$result = ($one) ? "one" : ($two) ? "two" : "none";      // $result is "two"
?>
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";
?>
matheo at step dot polymtl dot ca
05-Sep-2003 07:37
You can use a short syntax for "if"
$a = (condition) ? value if condition is true : value if condition is false;

<?php
$a
= 1 ;
$b = 2 ;
$is_a_bigger = ($a > $b) ? 1 : 0 ;
echo
$a_is_bigger ;
# returns 0

$a = 2 ;
$b = 1 ;
$is_a_bigger = ($a > $b) ? 1 : 0 ;
echo
$is_a_bigger ;
# returns 1

?>