2.7PHP程序的流程控制
2.7 PHP程序的流程控制
所有PHP程序都由语句构成,程序就是一系列语句的序列。计算机通过执行这些语句可以完成特定的功能。一般情况下,程序都是从第一条语句开始执行,按顺序执行到最后一条语句。但有时因为某种情况,需要改变程序的执行顺序,这就需要对程序的流程进行控制。本节将介绍PHP程序的各种流程控制结构。
2.7.1 程序流程控制概述
计算机程序的执行结构有3种,为顺序执行结构、选择执行结构和循环执行结构,如图2-16所示。通过使用这3种控制结构,可以改变程序的执行顺序,以满足开发人员解决问题的需求。

图2-16 PHP程序的3种执行结构
顺序执行结构使程序从第一条语句开始,按顺序执行到最后一条语句。在选择执行结构中,程序可以根据某个条件是否成立选择执行不同的语句。在循环执行结构中,程序可以根据某种条件和指定的次数使某些语句执行多次。
PHP程序都是由一系列语句组成的,语句通常以分号结尾。此外,可以使用一对花括号“{”和“}”将一组语句组成一个语句组。例如如下代码:
{
$i = 123;
$s = "This is a string";
}
2.7.2 条件控制语句:if和if…else语句
PHP通过一系列条件控制语句完成程序的选择执行流程。PHP中使用if、if…else(elseif)语句构建选择程序结构。
1.if语句
if语句的结构如下,如果表达式expr的值为真(TRUE),才会执行语句statement。
if(expr)
statement
上述结构的含义是,当表达式expr成立时,语句statement才会被执行;否则,如果表达式expr不成立(即expr的值为FALSE),那么语句statement被忽略,不会执行。代码2-21是一个if语句的示例程序。
代码2-21 使用if语句2-21.php
01 <?php
02 $a = 2; //
定义两个整型变量$a
和$b
03 $b = 3;
04
05 echo "$a = ".$a;
06 echo "<br/>";
07 echo "$b = ".$b;
08 echo "<br/>";
09 echo "<br/>";
10
11 if($a<$b) //
比较两个变量的大小
12 echo "$a
小于 $b";
13 ?>
【代码解析】代码第11行中表达式$a<$b的值为1(TRUE),所以程序执行echo语句输出“$a小于$b”。if后面可以跟一个空语句,即只加一个分号“;”的语句,表示当条件成立时,什么都不做。例如如下代码,if后跟了一个使用分号结束的空语句,表示当表达式$a<$b的值为1时,程序什么都不做。
if($a<$b) ;
2.if…else语句
if…else语句的结构如下,如果表达式expr的值为真,程序执行语句statement1;否则程序执行statement2。两个语句只能有一个被执行,另外一个将会被忽略。
if(expr)
statement1
else
statement2
代码2-22演示了if…else语句的使用方法。
代码2-22 使用if…else语句2-22.php
01 <?php
02 $a = 2; //
定义两个整型变量$a
和$b
03 $b = 3;
04
05 if($a>$b) //
比较两个变量的大小
06 echo "$a
大于 $b";
07 else
08 echo "$a
小于或等于 $b";
09 ?>
【代码解析】代码第05行中,表达式$a>$b的值为0(FALSE),所以if后的语句echo"$a大于$b"被忽略,转去执行else后面的echo语句。在PHP中,else并不是单独的语句,它和if语句必须成对使用,也就是说不能将其从if语句中分离出来单独使用。
如果判断条件成立时要执行的语句只有一条,那么if语句后可以不加花括号“{”和“}”,就像上面几个示例程序写的那样。如果判断条件成立时有多条语句要执行,那么这些语句应该组成语句组,要放在一对花括号里。例如示例代码2-23,当条件成立时,需要执行7条语句,因此它们都在花括号里。
代码2-23 if…else语句2-23.php
01 <?php
02 $a = 2; //
定义两个整型变量$a
和$b
03 $b = 3;
04
05 if($a<$b) //
比较两个变量的大小
06 {
07 echo "$a = ".$a;
08 echo "<br/>";
09 echo "<br/>";
10
11 echo "$b = ".$b;
12 echo "<br/>";
13 echo "<br/>";
14
15 echo "$a
小于 $b";
16 }
17 else
18 {
19 echo "$a
和 $b
比较";
20 echo "$a
大于等于 $b";
21 }
【代码解析】代码第06~16行是在满足第05行的条件下执行的{}语句块,第18~21行是在不满足条件的情况下执行的{}语句块。该程序的执行结果如图2-17所示。
3.if…elseif语句
if…elseif语句的结构如下,如果表达式expr1的值为1,程序执行语句statement1;否则判断表达式expr2,如果expr2的值为1,程序执行语句statement2;否则,如果有其他表达式需要判断,则依次判断下去,如果所有表达式的值都不为1,则执行else后的statement语句。
if(expr1)
statement1
elseif(expr2)
statement2
…
else
statement
如果其中有一个表达式的值为1,那么它的语句将被执行,因此,剩下的表达式将不会做判断,程序直接从控制结构中跳出,接着执行后续代码。代码2-24演示了if…elseif语句的使用。
代码2-24 使用if…elseif语句2-24.php
01 <?php
02 $a = 2; //
定义两个整型变量$a
和$b
03 $b = 2;
04
05 echo "$a = ".$a;
06 echo "<br/>";
07 echo "$b = ".$b;
08 echo "<br/>";
09 echo "<br/>";
10
11 if($a<$b) //
比较两个变量的大小
12 echo "$a
小于$b";
13 elseif($a>$b)
14 echo "$a
大于$b";
15 elseif($a==$b)
16 echo "$a
等于$b";
17 else
18 "error!";
19 ?>
【代码解析】代码中,因为只有第15行的表达式$a==$b成立,所以只有第16行的语句“echo"$a等于$b"”被执行。当这条语句被执行后,程序将从if…elseif控制结构中跳出,不会执行到代码elseif($a>$b),即程序不会再去做$a>$b是否成立的判断。程序执行结果如图2-18所示。

图2-17 if…else语句的使用

图2-18 if…elseif语句的使用
2.7.3 switch结构
2.7.2小节介绍了使用if或者if…else语句的选择控制结构,if语句通常需要计算逻辑表达式的值。本小节将介绍另一种选择控制结构——switch结构,它不需要计算逻辑表达式的值。switch的语法结构如下。
switch(expr)
{
case value1:
statement1
break;
case value2:
statement2
break;
…
case valuen:
statementn
break;
default:
statement
}
注意 在PHP中,switch、case、break和default都是保留关键字。
switch结构首先计算表达式expr的值,如果expr的值与某个case的值匹配,则从case后面的语句开始执行,直到遇到break语句(该语句将在后面详细介绍)或整个switch结构结束。比如,如果expr的值是value2,那么语句statement2将会被执行。
如果expr的值不与任何case值匹配,则执行default后面的语句。如果没有default语句,而且表达式expr的值不与任何case值匹配,那么程序从switch结构中跳出。代码2-25是一个switch结构的使用示例程序。
代码2-25 使用switch结构2-25.php
01 <?php
02 $a = 3;
03 switch($a) //
使用switch
结构判断变量$a
的值
04 {
05 case 1: //
如果是1
06 echo "It"s January";
07 break;
08 case 2: //
如果是2
09 echo "It"s February";
10 break;
11 case 3: //
如果是3
12 echo "It"s March";
13 break;
14 case 4: //
如果是4
15 echo "It"s April";
16 break;
17 default: //
如果都不是
18 echo "Other months";
19 }
20 ?>

图2-19 switch结构
【代码解析】如果变量$a的值不在01~04之间,则默认执行default下面的语句。读者可更改变量$a的值进行测试。程序执行结果如图2-19所示。
2.7.4 循环控制语句:for循环语句
前面两小节讲述的是程序的选择控制流程,本小节开始讲述程序的循环控制流程。循环控制流程可以控制程序,在满足某些条件的时候,某些语句被循环执行多次。PHP的循环控制主要有for语句、while语句和do…while语句。
for循环语句的结构如下,该语句括号中的初始化语句、循环条件表达式和更新语句,叫做for循环控制语句,它们控制着语句的循环体,即语句statement,该语句即可以是单条语句,也可以是由花括号“{”和“}”括起来的语句组。
for(
初始化语句;
循环条件表达式;
更新语句)
statement
for语句的执行过程如下。
(1)执行初始化语句。
(2)判断循环条件表达式,如果其值为TRUE(非0),则执行for语句的循环体statement语句。然后执行更新语句。
(3)再次执行第2步,直到循环条件表达式的值为FALSE为止。
图2-20更清楚地说明了for语句的执行过程。代码2-26是一个使用for循环语句的示例,它通过for语句循环输出10以内的偶数。
代码2-26 for循环语句的使用2-26.php
01 <?php
02 echo "
输出10
以内的偶数:";
03 echo "<br/>";
04 echo "<br/>";
05
06 for($i=0;$i<=10;$i++) //
实现从0
到10
的循环
07 {
08 if($i%2==0)
09 {
10 echo $i;
11 echo "<br/>"; //
输出换行符
12 }
13 }
14 ?>
【代码解析】代码中的for循环中,首先执行初始化语句“$i=1;”,将变量$i的值指定为1。接着,计算循环条件$i<=10。因为此时$i<=10的值为TRUE,所以执行if语句块。然后执行更新语句,$i++将变量$i的值更新为2后,再次计算循环条件,以此类推。当$i的值变成11时,循环条件的值为FALSE,此时for循环终止,程序跳出for循环结构,接着执行后续代码。程序执行结果如图2-21所示。

图2-20 for循环执行示意图

图2-21 for循环语句的使用
2.7.5 while循环语句
除for循环语句之外,还可以使用while语句控制程序循环执行。while循环语句的结构如下。
while(expr)
statement
这里的语句statement可以是单条语句,也可以是语句组。该结构的执行流程是:当表达式expr的值为真时,就执行循环体——语句statement,然后再次计算表达式expr的值,直到expr的值为假,程序中断循环,跳出while循环结构。代码2-27演示了如何使用while语句它通过while循环输出0~20以内的5的倍数。
代码2-27 while语句的使用2-27.php
01 <?php
02 $a = 0;
03
04 while($a<=20) //
使用while
语句循环从0
到20
的值
05 {
06 echo "$a";
07 echo "<br/>";
08 $a = $a+5;
09 }
10 ?>

图2-22 while循环语句的使用
【代码解析】代码将变量$a的值初始化为0。while语句首先计算表达式$a<=20的值,该表达式的值为TRUE,所以执行while语句中的循环体“echo"$a";”、“echo"<br/>"”;和“$a=$a+5;”。该循环体第一条语句将输出变量$a的值——0,第二条语句将变量的值更改为5。接着,while语句中的条件表达式被重新计算,因为此时$a的值为5,表达式$a<=20的值仍为TRUE,所以继续执行循环体中的语句。这个过程反复进行,直到条件表达式$a<=20的值为FALSE为止。程序执行结果如图2-22所示。
2.7.6 do…while循环语句
do…while语句也可以用来控制程序循环执行。do…while循环语句的结构如下。
do
statement
while(expr);
这里的语句statement可以是单条语句,也可以是语句组。该结构的执行流程是:程序首先执行语句statement,然后计算表达式expr的值;如果表达式expr的值为TRUE,就再次执行语句statement。
注意 do…while循环控制流程与for和while不同的是,该语句的循环体至少会执行一次,因为do…while语句是在循环体执行后才做条件表达式的判断。
示例代码2-28通过do…while循环计算1~50之间的整数的和。
代码2-28 do…while循环语句的使用2-28.php
01 <?php
02 $i = 1;
03 $s = 0; //
定义变量$s
来保存数字的和
04
05 do
06 {
07 $s = $s + $i;
08 $i++;
09 }
10 while($i<=50); //
使用do
…while
循环从1
到50
11
12 echo "1 + 2 + 3 +...+ 49 + 50 = ".$s;
13 ?>

图2-23 do…while语句的使用
【代码解析】不管do…while语句中的条件是什么,第07~08行代码都会执行一遍。$i的值从1开始,一直进行求和运算,一直到$i是50为止。上述程序的执行结果如图2-23所示。
2.7.7 break和continue语句
1.brake语句
break语句可以使程序流程跳出switch结构,可以在switch、for、while和do…while语句中使用,这样可以使程序立即跳出该循环结构。请看示例代码2-29。
代码2-29 break语句的使用2-29.php
01 <?php
02 define(PI,3.14); //
定义常量PI
03
04 for($r=1;$r<=10;$r++) //
从1
到10
循环
05 {
06 $area = PI * $r * $r;
07 if($area>100) //
如果面积大于100
08 break;
09
10 echo "r=$r, area=$area";
11 echo "<br/>";
12 echo "<br/>";
13 }
14 ?>
【代码解析】代码计算半径1~10的圆的面积,直到面积大于100时为止。当面积area>100时,执行第08行的break语句,中断循环,不再执行剩余的几次循环。程序的执行结果如图2-24所示。
从程序的执行结果可以看出,for循环只执行了5次就因break语句而退出,剩下的5次循环没有执行。
2.continue语句
continue语句的作用是结束当前的循环,即跳过该循环体中剩余的语句,转而执行下次循环,前提是循环条件满足。
continue语句和break语句的区别是,continue语句只是结束本次循环,而break语句是终止整个循环的执行,不再做条件的判断。代码2-30演示了continue语句的使用。
代码2-30 continue语句的使用2-30.php
01 <?php
02 for($a=100;$a<=200;$a++) //
从100
到200
进行循环
03 {
04 if($a%3==0)
05 continue; //
结束本次循环
06 echo $a;
07 echo "<br/>";
08 }
09 ?>
【代码解析】代码将100~200之间不能被3整除的数输出。当$a能被3整除时,执行第5行的continue语句,结束本次循环,继续执行for循环语句,只有$a不能被3整除时才使用echo语句将该数字输出。该程序执行结果如图2-25所示。

图2-24 break语句的使用

图2-25 continue语句的使用
2.7.8 条件运算符?:
条件运算符(?:)的用法如下。
expr1 ? expr2 : expr3
可以看出,条件运算符有3个操作数,所以它是三目运算符。它的计算规则是:如果表达式expr1的值为TRUE,那么整个表达式的值就取expr2的值,否则就取expr3的值。如下代码即使用条件运算符来获取两个数中较大的数。
$max = ($a>=$b) ? $a : $b
当表达式$a>=$b为TRUE时,整个表达式的值就是变量$a的值,这意味着会将$a的值赋给变量$max,从而取得$a和$b之间较大的那个数。
当然,上述代码也可以使用if…else语句实现,但使用条件运算符可以使程序更精炼,而且条件运算符在判断条件较复杂的情况下比if…else语句执行更快速。
