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语句执行更快速。
共有条评论 网友评论