PHP 控制结构
A、if:if 语句可以无限层地嵌套在其它 if 语句中,这给程序的不同部分的条件执行提供了充分的弹性。
B、else: else 语句仅在 if 以及 elseif(如果有的话)语句中的表达式的值为 FALSE 时执行, else 延伸了 if 语句。
C、else if:elseif 的语句仅在之前的 if 或 elseif 的表达式值为 FALSE,而当前的 elseif 表达式值为 TRUE 时执行。
D、while: 表达式的值在每次开始循环时检查,所以即使这个值在循环语句中改变了,语句也不会停止执行,直到本次循环结束。
E、do-while :do-while 表达式的值是在每次循环结束时检查而不是开始时,do-while 的循环语句保证会执行一次
(表达式的真值在每次循环结束后检 查),do-while 循环另一用法,把语句放在 do-while(0) 之中,
在循环内部用 break 语句来结束执行 循环。
以下代码片段示范了此方法:
<?php
do {
if ($i < 5) {
echo "i is not big enough";
break;
}
$i *= $factor;
if ($i < $minimum_limit) {
break;
}
echo "i is ok";
/* process i */
} while(0);
?>
F、for: 显示数字 1 到 10:
<?php
/* example 1 */
for ($i = 1; $i <= 10; $i++) {
echo $i;
}
/* example 2 */
for ($i = 1; ; $i++) {
if ($i > 10) {
break;
}
echo $i;
}
/* example 3 */
$i = 1;
for (;;) {
if ($i > 10) {
break;
}
echo $i;
$i++;
}
/* example 4 */
for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);
?>
当然,第一个例子看上去最正常(或者第四个),但用户可能会发现在 for 循环中用空的表达式在很多场合下会很方便。
G、foreach :foreach 仅能用于数组
foreach (array_expression as $value)
statement
第一种格式遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。
foreach (array_expression as $key => $value)
statement
第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量 $key。
H、break: break 结束当前 for,foreach,while,do-while 或者 switch 结构的执行。
<?php
$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
while (list (, $val) = each($arr)) {
if ($val == 'stop') {
break; /* You could also write 'break 1;' here. */
}
echo "$val<br /> ";
}
/* 使用可选参数 */
$i = 0;
while (++$i) {
switch ($i) {
case 5:
echo "At 5<br /> ";
break 1; /* 只退出 switch. */
case 10:
echo "At 10; quitting<br /> ";
break 2; /* 退出 switch 和 while 循环 */
default:
break;
}
}
?>
I、continue:continue 在循环结构用用来跳过本次循环中剩余的代码并在条件求值为真时开始执行下一次循环。
<?php
while (list ($key, $value) = each($arr)) {
if (!($key % 2)) { // skip odd members
continue;
}
do_something_odd($value);
}
$i = 0;
while ($i++ < 5) {
echo "Outer<br /> ";
while (1) {
echo " Middle<br /> ";
while (1) {
echo " Inner<br /> ";
continue 3;
}
echo "This never gets output.<br /> ";
}
echo "Neither does this.<br /> ";
}
?>
省略 continue 后面的分号会导致混淆。
<?php
for ($i = 0; $i < 5; ++$i) {
if ($i == 2)
continue;
print "$i ";
}
?>
J、switch:把同一个变量(或表达式)与很多不同的值比较,并根据它等于哪个值来执行不同的代码。
Note: 注意和其它语言不同,continue 语句作用到 switch 上的作用类似于 break。
如果在循环中有一个 switch 并希望 continue 到外层循环中的下一个轮回,用 continue 2。
使用两种不同方法实现同样的事,一个用一系列的 if 语句,另一个用 switch 语句:
Example #1 switch 结构
<?php
if ($i == 0) {
echo "i equals 0";
} elseif ($i == 1) {
echo "i equals 1";
} elseif ($i == 2) {
echo "i equals 2";
}
switch ($i) {
case 0:
echo "i equals 0";
break;
case 1:
echo "i equals 1";
break;
case 2:
echo "i equals 2";
break;
}
?>
Example #2 switch 结构可以用字符串
<?php
switch ($i) {
case "apple":
echo "i is apple";
break;
case "bar":
echo "i is bar";
break;
case "cake":
echo "i is cake";
break;
}
?>
为避免错误,理解 switch 是怎样执行的非常重要。switch 语句一行接一行地执行(实际上是语句接语句)。开始时没有代码被执行。仅当一个 case 语句中的值和 switch 表达式的值匹配时 PHP 才开始执行语句,直到 switch 的程序段结束或者遇到第一个 break 语句为止。如果不在 case 的语句段最后写上 break 的话,PHP 将继续执行下一个 case 中的语句段。
<?php
switch ($i) {
case 0:
echo "i equals 0";
case 1:
echo "i equals 1";
case 2:
echo "i equals 2";
}
?>
这里如果 $i 等于 0,PHP 将执行所有的 print 语句!如果 $i 等于 1,PHP执行后面两条 print 语句。只有当 $i 等于 2 时,才会得到“预期”的结果——只显示“i equals 2”。所以,别忘了 break 语句就很重要(即使在某些情况下故意想避免提供它们时)。在 switch 语句中条件只求值一次并用来和每个 case 语句比较。在 elseif 语句中条件会再次求值。如果条件比一个简单的比较要复杂得多或者在一个很多次的循环中,那么用 switch 语句可能会快一些。在一个 case 中的语句也可以为空,这样只不过将控制转移到了下一个 case 中的语句。 <?php
switch ($i) {
case 0:
case 1:
case 2:
echo "i is less than 3 but not negative";
break;
case 3:
echo "i is 3";
}
?>
一个 case 的特例是 default。它匹配了任何和其它 case 都不匹配的情况。例如: <?php
switch ($i) {
case 0:
echo "i equals 0";
break;
case 1:
echo "i equals 1";
break;
case 2:
echo "i equals 2";
break;
default:
echo "i is not equal to 0, 1 or 2";
}
?>
case 表达式可以是任何求值为简单类型的表达式,即整型或浮点数以及字符串。不能用数组或对象,除非它们被解除引用成为简单类型。
switch 支持替代语法的流程控制。
<?php
switch ($i):
case 0:
echo "i equals 0";
break;
case 1:
echo "i equals 1";
break;
case 2:
echo "i equals 2";
break;
default:
echo "i is not equal to 0, 1 or 2";
endswitch;
?>
K、return:如果在一个函数中调用 return() 语句,将立即结束此函数的执行并将它的参数作为函数的值返回。
return() 也会终止 eval() 语句或者脚本文件的执行。
如果在全局范围中调用,则当前脚本文件中止运行。
如果当前脚本文件是被 include() 的或者 require() 的,则控制交回调用文件。
此外,如果当前脚本是被 include() 的,则 return() 的值会被当作 include() 调用的返回值。
如果在主脚本文件中调用 return(),则脚本中止运行。
如果当前脚本文件是在 php.ini 中的配置选项 auto_prepend_file 或者 auto_append_file 所指定的,则此脚本文件中止运行。
Note: 注意既然 return() 是语言结构而不是函数,因此其参数没有必要用括号将其括起来。
通常都不用括号,实际上也应该不用,这样可以降低 PHP 的负担。
L、require:require() 语句包含并运行指定文件。
require() 和 include() 几乎完全一样,除了处理失败的方式不同之外。
include() 产生一个Warning而 require() 则导致一个 Fatal Error。
require_once() 语句在脚本执行期间包含并运行指定文件。
此行为和 require() 语句完全相同,唯一区别是如果该文件中的代码已经被包含了,则不会再次包含。
M、include:include() 产生一个警告而 require() 则导致一个致命错误。
换句话说,如果想在遇到丢失文件时停止处理页面就用 require()。
include() 脚本会继续运行。
include_once() 应该用于在脚本执行期间同一个文件有可能被包含超过一次的情况下,
想确保它只被包含一次以避免函数重定义,变量重新赋值等问题。
N、goto:goto操作符可以用来跳转到程序中的某一指定位置。该目标位置可以用目标名称 加上冒号来标记。
PHP中的goto有一定限制,只能在同一个文件和作用域中跳转, 也就是说你无法跳出一个函数或类方法,也无法跳入到另一个函数。
也无法跳入到任何循环或者switch 结构中。
常见的用法是用来跳出循环或者switch,可以代替多层的break。
Example #1 goto 示例
<?php
goto a;
echo 'Foo';
a:
echo 'Bar';
?>
以上例程会输出:
Bar
Example #2 goto 跳出循环示例
<?php
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
if($j==17) goto end;
}
}
echo "i = $i";
end:
echo 'j hit 17';
?>
以上例程会输出:
j hit 17