文章教程

2.7PHP程序的流程控制

9/17/2020 9:31:19 PM 人评论 次浏览

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语句执行更快速。

教程类别