第6章顺序流程
第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件商品
上一篇:第5章运算符、表达式和语句
下一篇:第7章函数
