PHP 流程控制语句

本文最后更新于:2024年3月18日 凌晨

PHP 流程控制语句

PHP支持许多传统程序结构来控制程序的执行流程,条件语句(如if/else和switch)依据一些条件,允许程序执行不同的代码块或什么都不执行,循环(如while和for)支持重复执行特定的代码段。

if

  • if语句检查一个表达式的真假,如果表达式为true,则执行一条语句,if语句如下所示:
1
2
if(expression)
statement
  • 当表达式为false时,使用else关键字来指定执行另一条语句:
1
2
3
4
5
6
7
8
9
if(expression)
statement
else
statement
// 例如:
If($user_validated)
echo "Welcome!";
else
echo "Access Forbidden!";
  • 要在if语句中包含多条语句,可以使用大括号来包含语句:
1
2
3
4
5
6
7
if($user_validated) {
echo "welcome!";
$greeted = 1;
}else{
echo "Access Forbidden!";
exit;
}
  • PHP为if提供了另一种语法,不用大括号将语句段包含起来,而用冒号(:)结束if,并用一个特定的结束关键字来结束代码段(在这里是endif),例如:
1
2
3
4
5
6
7
if($user_validated):
echo "Welcome!";
$greeted = 1;
else :
echo "Access Forbidden!";
exit;
endif;
  • 在本章描述的其他语句段也有类似的语法(和结束关键字),在语句中有大量HTML代码时,它们将很有用,例如:
1
2
3
4
5
6
7
8
9
<? if($user_validated):?>
<table>
<tr>
<td>First Name:</td><td>sophia</td>
</tr>
</table>
<?else:?>
Please log in.
<?endif?>
  • 因为if是一个语句,可以链接(内嵌):
1
2
3
4
5
6
7
if($good)
print('Dandy!');
else
if($error)
print('Oh,no!');
else
print("I'm ambivalent...");
  • if语句链(连续多个条件判断)是非常常见的,所以PHP提供了一个更简单的语法:elseif语法,例如,前面的代码可以这样重写:
1
2
3
4
5
6
if($good)
print('Dandy!');
elseif($error)
print('Oh,no!');
else
print("I'm ambivalent...");
  • 三元条件操作符?:可以用于简化ture/false检查,拿一个常见的情况来说,如检查给定的变量是否为true,如果是true,则将打印出某些信息,使用一个普通的if/else语句,如下所示:
1
<td><? if($active) echo 'yes'; else echo 'no'; ?></td>
  • 使用三元条件运算符,如下所示:
1
<? echo '<td>'.($active ? 'yes':'no').'</td>' ?>
  • 比较两个的语法:
1
2
if(expression) true_statement else false_statement
(expression) ? true_expression : false_expression
  • 最主要的区别是条件操作符根本不是一个语句,这意味着它只在表达式中使用,并且一个完整三元表达式的结果本身是一个表达式,如果使用if,echo语句在if条件句中,而当使用三元操作符,echo将在表达式之前。

switch

  • 某个变量的值可能决定了在许多不同选择中选择哪一个(例如,变量存放用户名,并且你想要为每个用户做不同的事情),switch语句就是为这种情况设计的。
  • switch语句将一个表达式的值和switch中的所有情况(case)比较,匹配的case中的所有的语句都将执行,直到遇到第一个break关键字,如果没有匹配的,并且有给出一个default,则在default关键字之后的所有语句都被执行,直到遇到第一个break关键字。
  • 例如下代码:
1
2
3
4
5
6
7
8
if($name == 'ktatroe')
// 处理。
elseif ($name == 'rasmus')
// 处理。
elseif($name == 'petermac')
// 处理。
elseif($name == 'bobk')
// 处理。

可以使用下面的switch语句代替上面的语句:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
switch($name){
case 'ktatroe':
// 处理。
break;
case 'rasume':
// 处理。
break;
case 'petermac':
// 处理。
break;
case 'book':
// 处理。
break;
}
  • 另一种语法结构是:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
switch($name):
case 'ktatroe':
// 处理。
break;
case 'rasume':
// 处理。
break;
case 'petermac':
// 处理。
break;
case 'book':
// 处理。
break;
endswitch;
  • 因为从匹配的case到下一个break关键字中的语句都被执行,所以可以将几个case的操作合并在一个中,在下面的例子中,当$name等于"sylvie"或"bruno"时打印"yes"
1
2
3
4
5
6
7
8
9
switch($name){
case 'sylvie':
case 'bruno':
print('yes');
break;
default:
print('no');
break;
}
  • 使用这样的直通(fall-through)代码是个好主意,这样就不需要在某些地方添加break
  • 可以为break关键字指定可选的级别数来退出代码执行,用这种方法,一个break语句可以跳出几层的switch嵌套语句。

while

1
2
while(expression)
statement
  • 如果expression求值为tue,statement就会执行,然后expression会再次求值(如果依然是true,循环体会再次执行,以此类推),当表达式值为false时循环推出。
  • 以下例子是将数字1-10相加的代码:
1
2
3
4
5
6
$total = 0;
$i = 1;
while($i <= 10){
$total += $i;
$i++;
endwhile;

break

  • 可以使用break关键字提前退出循环,在下面的代码中,$i从未达到值6,因为当它达到5时循环就停止了:
1
2
3
4
5
6
7
8
$total = 0;
$i = 1;
while($i <= 10){
if($i == 5)
break;// 退出该循环。
$total += $i;
$i++;
}
  • 可以放一个数字再break关键字之后来指明要退出的循环结构为几层,用这种方法,一个被深埋在嵌套循环中的语句可以退出到最外层的循环,例外:
1
2
3
4
5
6
7
8
9
10
11
12
13
$i = 0;
while($i <10){
while($j < 10){
if($j == 5)
break 2;// 退出两层while循环。
$j++;
}
$i++;
}
echo $i;
echo $j;
0
5

continue

  • continue语句跳到循环条件的下一轮,和break关键字一样,该语句也可以跳到循环结构中任意的层数的下一轮,和break关键字一样,该语句也可以跳到循环结构中任意的层数的下一轮。
1
2
3
4
5
6
7
8
while($i <10){
$i++;
while($j <10){
if($j == 5)
continue 2;// 继续通过两层循环。
$j++;
}
}
  • 在这段代码中,continue 2表示跳到从里到外第二级while循环的下一轮,所以$j从未有一个大于5的值,但是$i经历了从0到9的所有值。

do/while

  • PHP也支持do/while循环,它使用以下的格式:
1
2
3
do
Statement
while(expression)
  • 使用do/while循环可确保循环体至少被执行一次(第一次):
1
2
3
4
5
$total = 0;
$i = 1;
do{
$total += $i++;
}while($i <= 10);
  • 和在不同的while语句中一样,在do/while语句中可以使用break和continue语句。
  • do/while语句有时被用于在一个错误条件发生时从一个代码块中退出,例如:
1
2
3
4
5
6
do{
// 其他语句。
if($error_condition)
break;
// 其他语句。
}while(false);
  • 因为循环的条件是false,所以循环仅执行以一次,不管在该循环里发生了什么,然而,如果一个错误发生,在break之后的代码将不会被执行。

for

  • for语句和while语句类似,除了它增加了计数器初始化和计数器控制表达式之外,并且for语句常常比相同意思的while循环更简短和更容易阅读。
  • 这是一个从0到9计数的while循环,打印出每个数:
1
2
3
4
5
$counter = 0;
while($phpcounter <10){
echo "Counter is $counter\n";
$counter++;
}
  • 下面是相应的更简明的for循环:
1
2
for($counter = 0;$counter <10;$counter++)
echo "Counter is $counter\n";
  • for语句的结构是:
1
2
for(start; condition;increment)
Statement
  • 表达式start只在for语句的开始执行一次,每次经过循环时,表达式condition都要被检查是否为真,如果为true,则循环体被执行,如果为false,则循环结束,表达式increment在循环体运行之后被计算。
  • for语句的另一种语法是:
1
2
3
4
for(expr1;expr2;expr3):
statement;
...;
endfor;
  • 这段程序是使用for循环将数字1到10相加:
1
2
3
4
$total = 0;
for($i = 1;$ <= 10:$i++){
$total += $i;
}
  • 这是使用另一种语法的相同循环:
1
2
3
4
$total = 0;
for($i = 1;$ <= 10:$i++):
$total += $i;
endfor;
  • for语句中的任意一个表达式都可以指定为多个用逗号分隔的表达式,例如:
1
2
3
4
$total = 0;
for($i = 0,$j = 0;$i <= 10;$i++,$j *=2){
$total += $j;
}
  • 也可以使用空语句,说明不需要设定任何循环条件,在大多数退化的形式中,for语句成为一个死循环,你可能不会想运行下面这个例子,因为它根本不会停止打印:
1
2
3
for(;;){
echo "Can't stop me!<br/>";
}
  • 和在while循环一样,在for循环里可以使用break和continue关键字来结束或跳出当前循环。

foreach

  • foreach语句可用于遍历数组中的元素,可以使用下面的语句循环遍历一个数组,访问每一个键:
1
2
3
foreach($array as $current):
//...
}
  • 另一种语法是:
1
2
3
foreach($array as $key => $value):
//...
endforeach;
  • 可以使用下面的语句循环遍历一个数组,访问键名和值:
1
2
3
foreach($array as $key => $value){
//...
}
  • 另一种语法是:
1
2
3
foreach($array as $key => $value):
//...
endforeach;

declare

  • declare语句可为一块代码指定执行指令,declare语句的结构如下:
1
2
declare(directive)
statement
  • 只有一种declare形式:Tick指令,Tick是一个在declare代码段中解释器每执行N条低级语句就会发生的事件,N的值是在declare中的directive部分用ticks=N来制定的,使用tick可以确定一个Tick函数被调用的频率(用代码语句的数目来粗略估计),Tick函数通过register_tick_function()注册,例如:
1
2
3
4
5
6
register_tick_function("some_function");
declare(tick = 3){
for($i = 0;$i <10;$i++){
// 处理。
}
}
  • 在这段代码中,some_function()即Tick函数,每次第三条语句执行之后,some_function()都会被调用。

exit和return

  • exit语句会结束当前整个脚本的执行,return语句则使其所在的函数或脚本停止执行。
  • exit语句带一个可选值,如果这是一个数字,则是进程的结束状态,如果是一个字符串,该值会在进程终止前被打印出来,die()函数是这种exit语句形式的别名:
1
2
3
4
$handle = @mysql_connect("localhost",$USERNAME,$PASSWORD);
if(!$handle){
die("Could not connect to database");
}
  • 更常用的写法是:
1
2
$handle = @mysql_connect("localhost",$USERNAME,$PASSWORD)
or die("Could not connect to database");

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!