第6章 顺序流程
人在走路时,总会碰到岔路,这时就要根据自己要到达的目的地选择其中的一条路走。这在PHP中被称为代码的条件分支和顺序流程。上一章中讲到任何PHP脚本都是由一系列语句构成的。一条语句可以是一个赋值语句,一个函数调用,一个循环,一个条件语句甚至是一个什么也不是的语句(空语句)。语句通常以分号结束。程序在执行的时候,是从上往下执行代码,在碰到有条件时,运行满足条件的代码。条件分支和顺序流程的特性形成了程序的控制结构。
6.1 有序的世界
想一想晚上回家进屋的顺序,如图6.1所示。
图6.1 进屋顺序
从这个生活中的例子可以看出,完成任何事情都有一个顺序,并且执行顺序还比较讲究。在上面的例子中,第2步开灯不可能在门开前就能办到,第3步在没开灯时摸不到鞋,或者穿错鞋,第4步进屋,如果没有换鞋就进屋就把地板给弄脏了。
流程顺序的安排是用来解决现实生活中一些问题的,流程在程序中同样重要。
6.2 条件分支
假设图6.1中的第2步中灯坏了,这个条件就不成立,这时候就只能点蜡烛了。这种情况在PHP中称为条件分支,下面就来看条件分支语句。
6.2.1 if语句
if,中文意思是“如果”。if语句用于当指定条件成立时,执行A动作,否则,不执行A动作。用流程图表示如图6.2所示。
图6.2 if语句
用PHP伪代码表示如下。
<?php if(我有一千万人民币) { 成立软件公司 } ?>
为了证明以上程序推断的正确性,下面看一个例子。
运行Zend Studio,打开项目php,新建文件“if.php”,并输入代码6-1。
代码6-1 条件分支
<?php // 首先设定我的人民币只有10元 $myRMB = 10; if($myRMB >= 10000000) { echo '我成立了一家软件公司'; } ?>
保存代码,按“F10”键启动调试器,再按“F11”键进行逐行调试,如图6.3所示。
图6.3 逐行调试
继续按一次“F11”键,绿色行往下执行一行,这就是逐行调试,当代码运行到第5行时,再按“F11”键,绿色行跳到了第8行,可见代码没有执行第7行,因为$myRMB的值没有大于或等于10 000 000RMB。
6.2.2 if...else语句
上节的if语句说的是如果一个条件成立则做一件事,不成立就跳过。if…else语句是如果一个条件成立则做一件事,不成立则做另外一件事情。用流程图表示,如图6.4所示。
图6.4 if…else语句
用PHP伪代码表示如下。
<?php if(我有一千万人民币) { 成立软件公司 } else { 继续挣钱 } ?>
代码意思为,假如笔者有一千万元就成立软件公司,否则就继续挣钱。
在Zend Studio中运行以下代码,查看结果输出了什么。
<?php // 首先设定我的人民币只有10元 $myRMB = 10; if($myRMB >= 10000000) { echo '我成立了一家软件公司'; } else { echo '继续挣钱'; } ?>
6.2.3 ?... :语句
“expr1 ? expr2 : expr3”这样的语句,在PHP中被称为三元运算符,用在某些情况下代替if…else语句,让代码更简洁。
首先看if…else语句的原型。
<?php if (条件) { 分支一 } else { 分支二 } ?>
原型中,分支一或分支二通常都是一组(多行)语句,用来分别实现条件是否成立时的动作。由于是一组(多行)语句,所以用一对大括号“{}”括在外面,用于形成复合语句。不过,有时候分支中的语句比较简单,这样写就不简洁,这时候就可以用三元运算符,一行代码就可以实现同样的效果。
看以下例子。
<?php if($a > $b) { $c = 1; } else { $c = 2; } ?>
在这个例子中,分支一、分支二都分别只有一条简单语句,这种情况就非常适合三元运算符,可以将以上代码改写成如下代码。
<?php $c = ($a > $b) ? 1 : 2; ?>
就一行话,多么简洁。语句中的问号,问的是变量$a是否大于变量$b,如果是,则得到值1,否则得到值2。用两句话说就是在$a > $b求值为TRUE时,$c的值为1,在$a > $b求值为FALSE时,$c的值为2。
注意 这个语句在PHP中被认为是运算符,其求值不是变量,而是语句的结果。在运算时,应直接使用结果进行运算,避免调用函数。
6.2.4 elseif语句
elseif语句原型。
<?php if(条件1) { 分支一 } elseif(条件2) { 分支二 } elseif(条件3) { 分支三 } else { 分支四 } ?>
elseif语句,与其名称表示的一样,它是if和else的组合,是多级关系,作用是延伸if语句,可以在原来if表达式的值为FALSE时执行不同的语句。和else不一样的是,当elseif语句中的条件表达式求值为TRUE时才执行其分支语句。
用流程图表示,如图6.5所示。
图6.5 elseif语句
代码6-2是一个实例。
代码6-2 条件分支
<?php $a = 10; $b = 10; if ($a > $b) { echo "a大于b"; } elseif ($a == $b) { echo "a等于b"; } else { echo "a小于b"; } ?>
在Zend Studio中运行此代码,结果为“a等于b”。
6.2.5 switch语句
多级elseif显然是用于那些可能需要进行多级判断的情况。如上节的例子中,如果$a正好是大于10,只需判断一次,但如果$a小于10,那就必须经过“是否大于10?是否等于10?”两次判断。PHP为了简化这种多级判断,又提供了switch语句。
switch语句伪代码如下。
<?php switch (数值型或字符型变量) { case 变量可能值1 : 分支一; break; case 变量可能值2 : 分支二; break; case 变量可能值3 : 分支三; break; ... default : 最后分支; ?>
在switch流程里,要学到4个关键字,switch、case、break和default。在switch (变量)这一行里,变量只能是整型、浮点型或字符型。程序先读出这个变量的值,然后在各个“case”里查找哪个值和这个变量相等,如果相等,条件成立,程序执行其分支,直到碰上break,或者到达了switch语句结尾,此流程结束。
代码6-3是一个例子。
代码6-3 switch分支
<?php $i = 1; // 可以更改这个值 switch ($i) { case 0: echo "i 等于0"; break; case 1: echo "i 等于 1"; break; case 2: echo "i 等于 2"; break; default: echo "i 不等于 0, 也不等于1,更不等于2"; } ?>
在Zend Studio中运行上例,尝试将变量$i的值依次改为0、1、2和其他数字,观察其结果有什么不同。
现在来了解一下switch、case、break和default的含义,意思分别是:开关、情况、中断、默认(值)。用一句话连起来说就是:根据开关值的不同,执行不同的情况,直到遇上中断,如果所有的情况都不符合开关值,那么就执行默认的分支。
使用switch结构有3个需要注意的地方。
- switch(数值或字符型变量)中,变量的类型只能是数值和字符串类型。
- 在case之后虽然可以是一个计算表达式,但不推荐这样写。
- 如果default分支存在,而case中没有满足条件的分支,程序执行default分支。
这一节讲述了PHP中的全部流程控制语句,这些控制结构有的可以相互替换,在实际应用中,选择一个合适的流程控制结构可以让代码更简洁、更高效,并能提高代码的易读性和易维护性,建议多做几个例子,把这一节的知识摸透。
6.3 循环
循环就是反复。笔者小学时的第一堂体育课,体育老师就让全班同学围着操场跑圈,一圈一圈地循环跑,在生活中,需要反复的事情很多,譬如吃饭、睡觉等。对于一些比较机械的循环,人们总是想找一个规律,让其按照这个规律反复地做下去。程序中也有循环,只要编写程序代码就可以使其反复执行。
6.3.1 while语句
while循环的伪代码。
<?php while(条件) { 语句 } ?>
上例中,while是“当”的意思,当条件成立(为真)时,执行大括号内的语句。看到这里,想起了if语句。
<?php if(条件) { 语句 } ?>
从代码上看,除了一个是while“当”,一个是if“如果”,其他部分完全一样,但实际的意思却不一样,if语句中是当条件成立只运行一次大括号内的代码,而while语句中却是一直运行大括号内的代码,除非条件不成立(为假)时才不继续运行。
用流程图表示,如图6.6所示。
图6.6 while语句
程序执行到while的条件处后,进行条件判断,如果条件成立,则执行“循环执行的语句”,然后按“循环”路线,再回头从条件处进行下一次条件判断,如果条件成立,则再执行“循环执行的语句”……直到某一次条件判断不成立了,程序就从“假”的路线跳出while循环。
代码6-4是一个例子。
代码6-4 while循环
<?php $i = 1; $num = 0; while($i <= 100) { $num += $i; $i++; } ?>
变量$num初始值为0,在每一遍的循环里,它都加上$i,而$i则每次都在被加后自加1。最终,$i递增到101,超过100,循环也就完成了任务。$num最终结果为5050。
为了更直观地观察while循环的变化,下面来跟踪这段程序。
运行Zend Studio,打开项目php,新建文件“while.php”,并输入上例中的代码,保存后设置一个断点,具体做法为单击代码前面的行号,此行代码变为浅红色,本例的断点设置在while行,如图6.7所示。
图6.7 设置断点
按“F10”键,此时代码运行到断点while行暂停,此行颜色变为绿色,将光标移动到变量$i上,看到此时变量$i的值为1,如图6.8所示。
图6.8 断点调试
用同样方法可以查看到$num的值还是0,此时按“F11”键进行逐行调试,按一次运行一行,按到第3次时,代码重新返回到第6行开始执行,这时候查看变量$i的值是2,如图6.9所示。
图6.9 循环调试
说明变量$i在循环中已经执行了1次$i++,又返回开始第2次判断和循环了,证明了循环正在进行。最后来看看此循环最后的结果,首先取消第1个断点,方法是再次单击断点行的行号,该行代码颜色恢复正常,然后将光标移动到while循环的结尾大括号“}”后,此时按快捷键“Shift+F10”,意思是运行代码至光标处停止,因为此时光标在循环尾,所以循环已经全部完成了,此时将光标放到变量$num和$i上,看到的结果是$num等于5050,$i等于101,如图6.10所示。
图6.10 while演示结果
6.3.2 do…while语句
先看do…while的伪代码。
<?php do { 循环执行的语句 } while(); ?>
do...while循环中和while循环最明显的区别是,前者将判断是否继续循环的条件放在后面。也就是说,就算是条件开始就不成立,循环也要被执行一次。
用流程图表示,如图6.11所示。
图6.11 do…while循环
为了更直观地说明do…while循环,下面将while和do…while来做一个比较。
【例1,while循环】
<?php $a = 1; while($a > 1) { $a--; } ?>
变量$a初始值为1,条件$a > 1显然不成立。所以循环体内的$a――语句未被执行,最终变量$a的值仍为1。
【例2,do…while循环】
<?php $a = 1; do { $a--; } while($a > 1); ?>
尽管循环执行前,条件$a > 1不成立,但由于程序在运行到do时,并不先判断条件,而是直接先运行一遍循环体内的语句$a――,于是$a的值变为0,然后程序才判断$a > 1,发现条件不成立,循环结束。最终,变量$a的值为0。
6.3.3 for语句
分析前面两个小节的循环,可以得出一个结论,一个循环中通常有3个特性,分别为:
- 一个初始化的条件。
- 一个条件成立机会。
- 一个满足条件的值。
首先,一个循环开始都有一个初始化的值,例如while循环例子中的变量$i = 1,这样才能形成比较。然后是一个条件成立机会,例如while循环例子中的常数100,这样比较条件才会成立。最后是满足条件的值,如while循环例子中的$i < 100,因为$i的值是1,条件成立,随后循环体内对$i进行自加运算,这样就始终会有条件满足的值,如果是$i不进行自加运算,那这个循环就成了“死循环”。
谈完这3个特性,来看for循环的语法。
<?php for(初始化条件; 条件; 条件改变) { 循环语句; } ?>
由以上结构可见,for循环结构包含了循环中的3个特性,和while不同的是3个特性不是依次写出来的,而是写在同一行。不过写在同一行并不表示同时运行,首先运行初始化条件,且只运行一次,然后是条件比较,如果条件成立,则运行后一句条件改变,执行循环语句。如果条件不成立,直接跳出循环。
现在举一个例子,1到100累加,只是不用while语句,而用for语句来写,如代码6-5所示。
代码6-5 for循环
<?php $num = 0; for($i = 1; $i <= 100; $i++) { $num += $i; } ?>
在上例代码中,程序先执行条件初始化语句$i=1,然后判断条件$i <= 100,显然此时该条件成立。于是程序执行循环体内的语句$num += $i,最后,执行改变条件语句$i++,此时$i的值变为了2,程序再次判断条件$i <= 100,条件依然成立,于是开始第二遍循环……
6.3.4 foreach语句
foreach循环仅仅用于数组,当试图将其用于其他数据类型或是一个未初始化的变量时,会产生错误。因为本书到目前为止还没有说到数组,所以在学习数组时,建议复习这一节。
foreach有两种用法,先看第一种用法。
<?php $ary = array(1, 2, 3, 4, 5, 6); foreach($ary as $value) { echo "值: $value<br>\n"; } ?>
此段代码中,数组$ary包含6个元素,foreach将$ary中的元素逐个打印,每循环1次就打印1个元素。
结合上面的例子来看另一种用法。
<?php $ary = array(1, 2, 3, 4, 5, 6); foreach($ary as $key => $value) { echo "索引 $key 的值: $value<br>\n"; } ?>
不同的地方是$value前面多了“$key =>”,意思是将键名赋给$key,键名是数组中元素的排序号,就像Zend Studio中每行代码前面的行号一样。数组其实就是一组数据的集合,排在第1个位置的元素其键名为0,第2个元素其键名为1。例如上例代码中的数组$ary,其第1个元素键值是1,键名为0。
PHP中有4种循环结构“while”、“do…while”、“for”和“foreach”。
- while循环从一开始就检查条件是否成立,如果成立就执行循环语句,不成立则不执行循环语句,直接跳出循环。
- do…while循环从一开始就执行1次循环语句,然后检查条件是否成立,如果成立就继续执行循环语句,不成立则结束循环。
- for循环是最灵活的循环,因为for循环包含了循环的3个特性,合理地使用for循环,将使代码更简洁。
- foreach循环只是用于数组,遍历数组是最快的。
在学习完这4种循环结构后,聪明的读者可能已经想到了一个问题,就像本节开始部分的例子一样,体育老师让同学们绕操场跑步,这就是循环。如果在绕圈跑中,有同学跑累了要退出,这个用程序如何描述呢?下面一节将介绍解决该问题的方法。
6.4 关键字
流程控制除了“如果”、“否则”就是循环跑圈,总的来说很简单,但就是这样简单的结构却支撑了整个程序框架,所以流程结构是程序基础中的重点。上节中最后留下了一个问题,就是流程控制中如何改变流程,这一节中将解答这个问题,并对流程控制结构做一个强化训练。
6.4.1 break语句
如上一节说到的情况,在绕操场跑步中,假设同学们跑累了要退出,则使用break关键字,如下面的伪代码。
<?php while(已跑圈数 < 要求跑完的圈数) { // 做一个判断 if(同学们累了) { break; // 停止跑圈 } } ?>
代码分析:从while开始跑圈,假设已跑圈数小于要求跑完的圈数,继续跑圈。在while代码块中,有一个if判断同学们是否跑累了,条件成立则运行break,退出循环。
还有一种办法,可以不使用break关键字,看下面伪代码。
<?php while(已跑圈数 < 要求跑完的圈数 && 同学们不累) { // 继续跑圈 } ?>
代码分析:这种方法是把判断合并到了while中,让while判断已跑圈数小于要求跑完的圈数,并且同学们不累才继续跑圈。
以上两种方法有不同,但使用的目的是一样的。下面在实际代码中运行上面的理论,运行Zend Studio,打开项目php,新建文件“break.php”,并输入以下代码6-6。
代码6-6 break语句
<?php $quanShu = 50; // 设定要求跑的圈数 $yiPao = 0; // 设置一个已跑圈数的初始值 $tiLi = 10; // 设置体力的初始值 while($yiPao < $quanShu) { echo '已跑' . $yiPao . "圈<br>\n"; echo '现在体力是' . $tiLi . "<br>\n"; $yiPao++; // 每跑一圈就加一圈 $tiLi--; // 每跑一圈体力减1 if($tiLi == 0) // 判断当体力等于0成立时 { echo '现在跑第' . $yiPao . '圈, 体力剩下' . $tiLi . ',退出'; break; // 使用break跳出循环 } echo '继续跑第' . $yiPao . "圈<br>\n"; } ?>
按“F10”键,再重复按“F11”键,一边按一边注意观察Zend Studio中下方的Variables区域中各个变量的变化情况,如图6.12所示。
图6.12 变量变化情况
当体力等于0时,执行了代码break,代码跳出while循环。由此可见,break用于当一个条件满足时,跳出整个循环。
6.4.2 continue语句
厨师要把10个鸡蛋煎熟,假设敲开蛋壳发现是坏的则丢掉不煎,此时应该使用continue,伪代码如下。
<?php while(敲开的鸡蛋 < 10个鸡蛋) { if(鸡蛋是坏的) { continue; // 从这里跳回到循坏开始,敲下一个鸡蛋 } echo '煎鸡蛋'; } ?>
这样,确保好鸡蛋才被煎,由此也可以看出continue和break不同之处在于,满足某一个条件时前者仅跳出当前这一次循环,而不跳出整个循环,而后者跳出整个循环。下面是一个在煎鸡蛋过程中使用continue的实例,运行Zend Studio,打开项目php,新建文件“continue.php”,并输入以下代码6-7。
代码6-7 continue语句
<?php $jiDan = 10; // 10个鸡蛋 $yiQiao = 0; // 已经敲开的鸡蛋数 $bad = 3; // 假设第3个鸡蛋是坏的 while($yiQiao <= $jiDan) { $yiQiao++; // 敲一个则加1 if($yiQiao == $bad) // 判断敲到第3个时 { echo "坏鸡蛋,不可以煎!<br>\n"; continue; // 从这里跳回到循环开始,敲下一个鸡蛋 } echo "好鸡蛋,可以煎...<br>\n"; } ?>
按“F10”键,再重复按“F11”键,一边按一边注意观察Zend Studio中下方的Variables区域中各个变量的变化情况,当敲到第3个时,执行了continue语句,跳出了本次循环,继续下一次循环。如果此时的continue换成break,那么当碰到第1个坏鸡蛋后,剩下的鸡蛋都不会被煎。最后看看break和continue流程的流程图演示对比,如图6.13所示。
图6.13 break和continue流程对比
6.4.3 return语句
Return,顾名思义就是返回的意思,既然是返回,那么return之后的代码就不会被执行。如果在函数中调用return,那么立即停止执行函数中剩余的代码;如果是在文件中调用return,那么该文件立即停止执行剩余的代码。
6.5 异常处理
程序未按期望运行被称为异常,如连接数据库失败等,这就需要异常处理,以便让开发人员及时知道程序的问题,异常处理的结构如下。
<?php try { // 需要异常处理的代码 } catch (Exception $e) { echo "捕获到异常: " . $e->getMessage(); } ?>
需要进行异常处理的代码都必须放入try代码块内,以便捕获可能存在的异常。每一个try至少要有一个与之对应的catch。使用多个catch可以捕获不同的类所产生的异常。当try代码块不再抛出异常或者找不到catch能匹配所抛出的异常时,代码就会在跳转到最后一个catch的后面继续执行。而一旦抛出异常,则try区块中抛出异常代码行后面的代码将停止执行。
下面是一个实例,运行Zend Studio,打开项目php,新建文件“try.php”,并输入以下代码6-8。
代码6-8 异常处理
<?php try { $error = '连接数据库失败'; // 这里假设连接数据库失败 throw new Exception($error); // 从这里开始,代码将不会被执行 echo '永远都不会执行'; } catch (Exception $e) { echo '捕获到异常: ', $e->getMessage(), "\n"; } echo '从这里继续执行...'; ?>
保存代码并按“F5”键,这时在Zend Studio的Debug output区域显示捕获到的异常和异常消息。
6.6 declare语句
declare用来设定一段代码的执行指令,按照PHP文档的说法,目前只接受一个指令ticks,这个指令通常用来调试,代码6-9是一个例子。
代码6-9 declare语句
<?php // 记录时间的函数 function profile($dump = FALSE) { static $profile; if ($dump) { $temp = $profile; unset($profile); return ($temp); } $profile[] = microtime(); } // 注册tick指令处理函数 register_tick_function("profile"); // 初始时间 profile(); // 评估的代码,两条低级语句就记录一次时间 declare(ticks=2) { for ($x = 1; $x < 50; ++$x) { echo similar_text(md5($x), md5($x*$x)), "<br />;"; } } // 显示调试数据 print_r(profile (TRUE)); ?>
通常在程序开发中,有IDE(如Zend Studio)可以调试,或有另外功能强大的专业测试工具,因此这个指令很少被使用,这里仅做了解。
6.7 流程控制强化训练
在学习语言中,有很多的教程中都有一些经典题目,下面有两个题,用于巩固学习到的知识。
• 第1题:用所学到的知识输出以下内容。
1 12 123 1234 12345 123456 1234567 12345678 123456789
看到此题目,可能有人已经快速给出了答案,如下所示。
<?php echo "1<br>\n"; echo "12<br>\n"; echo "123<br>\n"; … … ?>
如果有老师打分,这样肯定得0分,这叫取巧。这道题目将会使用到双层循环,外层循环用于控制输出9行,内层循环用于输出每行的数字。每一行都是从1开始,但第一行输出1个数字,第二行输出2个,第三行输出3个……
运行Zend Studio,打开项目php,新建文件“f1.php”,并输入代码6-10。
代码6-10 输出的例子
<?php for ($i = 1; $i <= 9; $i++) { for ($j = 1; $j <= $i; $j++) { echo $j; } echo "\n"; } ?>
保存代码并按“F5”键,这时在Zend Studio的Debug output区域输出了结果。
注意 如果Debug output区域是HTML视图,那么结果将是以空格隔开,要用HTML视图查看可以将代码中的“\n”换成“<br>”。
• 第2题:输出以下九九乘法表。
1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=24 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=36 7*9=63 8*9=72 9*9=81
这个题和第1题类似,也是输出一个三角形,解题思路也一样,逐行打印,每一行输出的内容都是i*j=k,其中k是积,由i和j决定。第1行是1*1,只有一个,看不出有什么特点。第2行是1*2 2*2等,这些数字都是分别乘以2。第3行是1*3 2*3 3*3等,这些数字都是分别乘以3。所以,在第1题的基础上,设当前行为第i行,则输出n*i,n为1到i。
运行Zend Studio,打开项目php,新建文件“f2.php”,并输入代码6-11。
代码6-11 九九乘法表
<?php for ($i = 1; $i <= 9; $i++) { for ($j = 1; $j <= $i; $j++) { echo $j . '*' . $i . '=' . $j*$i . ' '; } echo "\n"; } ?>
保存代码并按“F5”键,这时在Zend Studio的Debug output区域输出了结果。
6.8 典型实例
【实例6-1】if分支控制语句,在程序流程控制中是最简单,也是使用最多的语句。其主要用于根据给出的条件,运行相关的语句。
在程序运行时,为if提供一个表达式,如果表达式是TRUE值,将执行if后面的语句,如果为FALSE值,则忽略if后面的代码,继续执行其他代码段。
elseif是if语句的延伸,其自身也有条件判断的功能,在if运行条件为FALSE值时,elseif会判断自身的运行条件,如果为TRUE值时,则执行elseif内的代码段,如果运行条件为FALSE值,则跳过该代码段。
else也是if语句的延伸,其用在if或elseif语句后,当这两个语句的运行条件都为FALSE值时,运行其内的代码。
if、elseif、else结合使用,可以根据表达式的值来指定要运行的代码段,使程序在运行时,流程变得更加清晰。
代码6-12 if、elseif、else结合使用
<?php //自定义变量 $n1 = "Tom"; $n2 = "Kite"; $m1 = "中学"; $m2 = "大学"; $m3 = "篮球队员"; $m4 = "啦啦队员"; //使用if elseif else语句判断条件 function s($age,$sex){ global $n1,$n2,$m1,$m2,$m3,$m4; //使用global关键字,使函数可以访问已经定义的外部变量 $string = ""; if($sex == 1){ //当变量$sex值等于1时,运行下面的代码 $string .= $n1; //在变量$string后,添加变量$n1的内容 if($age>=18){ //嵌套演示 //在IF语句中嵌套使用IF语句 $string .= "是".$m2.$m3; //当变量$age的值大于等于18时,在变量$string后,连接变量$m2和$m3的值 }else{ $string .= "是".$m1.$m3; //当变量$age的值小于18时,在变量$string后,连接变量$m1和$m3的值 } }elseif($sex==0){ //elseif演示 $string .= $n2; if($age>=18){ $string .= "是".$m2.$m4; }else{ $string .= "是".$m1.$m4; } }else{ //在变量$sex不等于1,也不等于0的情况下,运行下面的代码 $string .= "无法判断性别"; } echo $string; } s(19,1); //运行函数s(),并给定两个参数 echo "<br>"; s(17,0); //运行函数s(),并给定两个参数 ?>
运行该程序后,运行结果如图6.14所示。
图6.14 程序运行结果
【实例6-2】PHP中最简单的循环就是while语句,其可以根据指定的条件,循环运行语句体内的代码。与while语句相似的还有do-while语句。
本章前面使用for语句输出九九乘法表,本实例演示使用while语句输出九九乘法表的方法,具体代码如下。
代码6-13 使用while语句输出九九乘法表
<?php //while 循环嵌套使用 $i = 1; while($i<=9){ //当变量$i的值小于等于9时,退出循环 $j=1; //在while语句中,嵌套使用while语句 while($j<=$i){ //当变量$j的值小于等于变量$i的值时,退出循环 echo $i."×".$j."=".$i*$j." "; $j++; //修改退出循环的条件 } echo "<br>"; $i++; //修改退出循环的条件 } ?>
运行该程序后,运行结果如图6.15所示。
图6.15 程序运行结果
【实例6-3】“break”和“continue”都是流程控制语句,在前面的小节中已经介绍过“break”语句和“continue”的使用方法,“break”语句主要用于跳出指定的循环,而“continue”语句也可以用于跳出指定的循环。
虽然“break”和“continue”都是用于跳过循环,但是也有不同之处,即“break”跳出循环时,同时结束循环。而“continue”只是跳过本次循环,而继续执行下一次循环。
代码6-14 break和continue的使用方法
<?php echo "<strong>在循环中使用continue</strong><br>"; for($i=1;$i<=6;$i++){ //建立一个循环6次的for语句 if($i==4){ //当循环条件变量等于4时,运行continue continue; //当条件满足,跳过此次循环 } echo $i."<br>"; } echo "<strong>在循环中使用break</strong><br>"; for($i=1;$i<=6;$i++){ if($i==4){ break; //当条件满足,结束循环 } echo $i."<br>"; } ?>
运行该程序后,程序运行结果,如图6.16所示。
图6.16 程序运行结果
6.9 小结
记得上学时,有个同学曾经问我:本来i=1,为什么循环之后它等于2了呢?它本来就是1啊!i不是常量,是变量,变量就是变化的数据。在循环中,它进行了运算,所以它的值会发生变化。从第2章到现在,每个基础知识点都很小,却凝聚了PHP语言最基础的语法,只要读者掌握了本章知识,开发一个小型程序已经是可能的了。
6.10 习题
一、填空题
1. PHP语言中比较常用的流程控制语句主要有_____、_____、_____等。
2. if判断语句中如果其值为_____,则相应语句被执行。
3. switch语句后面括号内的表达式可以是_____、_____、_____。
4. 若case语句中的常量表达式的值都没有与表达式的值匹配,则执行_____后面的语句。
二、选择题
1. 从循环体内跳出循环,即提前结束循环的语句是( )。
A. break语句
B. continue语句
C. if语句
D. switch语句
2. 下面程序的运行结果是( )。
<?php $i=1; do{ echo "您在该网站购买了".$i."件商品<br>"; $i++; }while($i%10==0); echo 浏览了.$i."件商品"; ?>
A.您在该网站购买了1件商品 浏览了1件商品
B. 您在该网站购买了2件商品 浏览了2件商品
C. 您在该网站购买了1件商品 浏览了2件商品
D. 您在该网站购买了2件商品 浏览了1件商品