文字

流程控制的替代语法

(PHP 4, PHP 5)

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

Note:

不支持在同一个控制块内混合使用两种语法。

更多例子参见 while,for 和 if。

用户评论:

[#1] v14t at gmx dot com [2014-04-06 14:14:01]

isset( $value ) AND print( $value );

the reason why it doesn't work with echo, it's because echo does not return anything, while print _always_ returns 1, which is considered true in the expression

[#2] josh at qaribou dot com [2014-03-05 22:17:03]

The reason temec987's approach of using boolean operators as an alternative to control structures won't work for an 'echo' is because the result of evaluating the expression will always be a boolean.

Other languages (e.g. ruby) are much better suited to this approach, as the expression evaluated will be the resultant value, e.g.:
5 && 4

In ruby, this would be 4, but in PHP, this would be true (type-juggled equivalent is 1), which isn't useful for anything but further binary logic.

You can still use logical operators as conditionals, but only for executing logic, not for getting a value back, e.g.:
<?php
defined
('USER_CAN_EXECUTE') or die('Access denied.');
?>


is a nice one to use for access control, or say you want to put in a quick check that your object has all the data loaded it needs to call a webservice (functions are just examples):
<?php
$this
->readyForService() and $this->postData('http://endpoint.com');
?>


What you can't use them for is something like this:
<?php
echo (strlen($mystring) > 5) and $mystring;
?>


instead, you'd use ternaries for that:
<?php
echo (strlen($mystring) > 5) ? $mystring null;
?>

[#3] timeroot dot alex at gmail dot com [2013-12-16 00:54:12]

The reason for the "workaround" jeremiah mentioned, in the case of the switch statement, can be understood as follows; in any place where you can have an echo statement (an if block, a switch's case, whatever), that's where you can have the raw HTML. In PHP this basically gets handled just like that -- like an echo statement. 

In between a switch and a case, though, you can't echo anything. By placing the switch and the case in two separate blocks of PHP, with a raw HTML newline echo'ed in between them, PHP basically had to try to find where that statement would be. And it can't be there, hence the difficulty.

[#4] temec987 at gmail dot com [2011-10-02 19:00:40]

A simple alternative to an if statement, which is almost like a ternary operator, is the use of AND. Consider the following:

<?php
     $value 
'Jesus';

     
// This is a simple if statement
     
if( isset( $value ) )
     {
          print 
$value;
     }

     print 
'<br />';

     
// This is an alternative
     
isset( $value ) AND print( $value );
?>


This does not work with echo() for some reason. I find this extremely useful!

[#5] ej at iconcept dot fo [2009-05-28 05:30:32]

if statement in 1 line
<?php
$hour 
11;

print 
$foo = ($hour 12) ? "Good morning!" "Good afternoon!";

?>

return Good morning!

[#6] flyingmana [2009-03-26 01:43:46]

It seems to me, that many people think that

<?php if ($a == 5): ?>
A ist gleich 5
<?php endif; ?>

is only with alternate syntax possible, but 

<?php if ($a == 5){ ?>
A ist gleich 5
<?php }; ?>

is also possible.

alternate syntax makes the code only clearer and easyer to read

[#7] jeremia at gmx dot at [2008-01-28 06:52:21]

If you wan't to use the alternative syntax for switch statements this won't work:

<div>
<?php switch($variable): ?>
<?php case 1?>
<div>
Newspage
</div>
<?php break;?>
<?php case 2?>
</div>
Forum
<div>
<?php break;?>
<?php endswitch;?>
</div>

Instead you have to workaround like this:

<div>
<?php switch($variable): 
case 
1?>

<div>
Newspage
</div>
<?php break;?>
<?php case 2?>
</div>
Forum
<div>
<?php break;?>
<?php endswitch;?>
</div>

[#8] skippy at zuavra dot net [2005-06-27 04:32:10]

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.

上一篇: 下一篇: