第一节流程控制【视频文件:流程控制】任何PHP脚本都是由一系列语句构成的。一条语句可以是一个赋值语句,一个函数调用,一个循环,甚至一个什么也不做的(空语句)条件语句。语句通常以分号结束。此外,还可以用花括号将一组语句封装成一个语句组。语句组本身可以当作是一行语句。本章讲述了各种语句类型。5.1.1ifif结构是很多语言包括PHP在内最重要的特性之一,它允许按照条件执行代码片段。如果$a大于$b,则以下例子将显示aisbiggerthanb:〈?phpif($a〉$b)printaisbiggerthanb;?〉经常需要按照条件执行不止一条语句,当然并不需要给每条语句都加上一个if子句。可以将这些语句放入语句组中。例如,如果$a大于$b,以下代码将显示aisbiggerthanb并且将$a的值赋给$b:〈?phpif($a〉$b){printaisbiggerthanb;$b=$a;}?〉if语句可以无限层地嵌套在其它if语句中,这给程序的不同部分的条件执行提供了充分的弹性。5.1.2else经常需要在满足某个条件时执行一条语句,而在不满足该条件时执行其它语句,这正是else的功能。else延伸了if语句,可以在if语句中的表达式的值为FALSE时执行语句。例如以下代码在$a大于$b时显示aisbiggerthanb,反之则显示aisNOTbiggerthanb:〈?phpif($a〉$b){printaisbiggerthanb;}else{printaisNOTbiggerthanb;}?〉else语句仅在if以及elseif(如果有的话)语句中的表达式的值为FALSE时执行。5.1.3elseifelseif,和此名称暗示的一样,是if和else的组合。和else一样,它延伸了if语句,可以在原来的if表达式值为FALSE时执行不同语句。但是和else不一样的是,它仅在elseif的条件表达式值为TRUE时执行语句。例如以下代码将根据条件分别显示aisbiggerthanb,aequaltob或者aissmallerthanb:〈?phpif($a〉$b){printaisbiggerthanb;}elseif($a==$b){printaisequaltob;}else{printaissmallerthanb;}?〉在同一个if结构中可以有多个elseif语句。第一个表达式值为TRUE的elseif语句(如果有的话)将会执行。在PHP中,也可以写成“elseif”(两个单词),它和“elseif”(一个单词)的行为完全一样。句法分析的含义有少许区别(如果你熟悉C语言的话,这是同样的行为),但是底线是两者会产生完全一样的行为。elseif的语句仅在之前的if或elseif的表达式值为FALSE,而当前的elseif表达式值为TRUE时执行。〈!--5-1.php:if……else……的应用--〉〈HTML〉〈HEAD〉〈TITLE〉if…else…的应用〈/TITLE〉〈/HEAD〉〈BODY〉〈?php//本程序测试时,请更改测试服务器的系统时间查看效果echo今天是:.date(D).〈br〉;if(date(D)==Sat)echo周末了,我们要去狂欢。〈br〉;if(date(D)==Sat){echo再次声明,周末了,我们要去狂欢,好高兴!〈br〉;}else{echo今天不是周末,我们要学习PHP5,多么有意义啊!!^_^!!!〈br〉;}if(date(D)==Sun){echo今天是星期天。;}elseif(date(D)==Mon){echo今天是星期一。;}elseif(date(D)==Tue){echo今天是星期二。;}elseif(date(D)==Wed){echo今天是星期三。;}elseif(date(D)==Thu){echo今天是星期四。;}elseif(date(D)==Fri){echo今天是星期五。;}else{echo今天是星期六(只可能是星期六了^_^)。;}?〉〈/BODY〉〈/HTML〉5.1.4whilewhile循环是PHP中最简单的循环类型。while语句的含意很简单,它告诉PHP只要while表达式的值为TRUE就重复执行嵌套中的循环语句。表达式的值在每次开始循环时检查,所以即使这个值在循环语句中改变了,语句也不会停止执行,直到本次循环结束。有时候如果while表达式的值一开始就是FALSE,则循环语句一次都不会执行。下面两个例子完全一样,都显示数字1到10:〈?php/*example1*/$i=1;while($i〈=10){print$i++;/*theprintedvaluewouldbe$ibeforetheincrement(post-increment)*/}/*example2*/$i=1;while($i〈=10):print$i;$i++;endwhile;?〉5.1.5do...whiledo...while和while循环非常相似,区别在于表达式的值是在每次循环结束时检查而不是开始时。和正规的while循环主要的区别是do..while的循环语句保证会执行一次(表达式的真值在每次循环结束后检查),然而在正规的while循环中就不一定了(表达式真值在循环开始时检查,如果一开始就为FALSE则整个循环立即终止)。do...while循环只有一种语法:〈!--文件6-2.php:do……while……的应用--〉〈HTML〉〈HEAD〉〈TITLE〉do……while……的应用〈/TITLE〉〈/HEAD〉〈BODY〉〈?php//本程序测试时,请更改两处$i的初始值为11//观看效果,分析区别$i=1;while($i〈=10){print$i++;echo.以后不敢了〈br〉\n;}echo第二次……〈br〉;$i=1;do{print$i++;echo.以后不敢了〈br〉\n;}while($i〈=10)?〉〈/BODY〉〈/HTML〉5.1.6forfor循环是PHP中最复杂的循环结构。它的行为和C语言的相似。for循环的语法是:for(expr1;expr2;expr3)statement第一个表达式(expr1)在循环开始前无条件求值一次。expr2在每次循环开始前求值。如果值为TRUE,则继续循环,执行嵌套的循环语句。如果值为FALSE,则终止循环。expr3在每次循环之后被求值(执行)。每个表达式都可以为空。expr2为空意味着将无限循环下去(和C一样,PHP认为其值为TRUE)。这可能不想你想象中那样没有用,因为你经常会希望用break语句来结束循环而不是用for的表达式真值判断。考虑以下的例子。它们都显示数字1到10:〈?php/*example1*/for($i=1;$i〈=10;$i++){print$i;}/*example2*/for($i=1;;$i++){if($i〉10){break;}print$i;}/*example3*/$i=1;for(;;){if($i〉10){break;}print$i;$i++;}/*example4*/for($i=1;$i〈=10;print$i,$i++);?〉当然,第一个例子看上去最正常(或者第四个),但你可能会发现在for循环中用空的表达式在很多场合下会很方便。PHP也支持用冒号的for循环的替代语法。for(expr1;expr2;expr3):statement;...;endfor;其它语言具有foreach语句来遍历数组或散列表,PHP也行(见foreach)。在PHP3中,可以结合list()和each()函数用while循环来达到同样效果。例子见这些函数的文档。5.1.7breakbreak结束当前for,foreach,while,do..while或者switch结构的执行。break可以接受一个可选的数字参数来决定跳出几重循环。〈!--文件4-18.php:break/continue的应用--〉〈HTML〉〈HEAD〉〈TITLE〉break/continue的应用〈/TITLE〉〈/HEAD〉〈BODY〉〈?phpecho使用break的输出效果:〈br〉;$i=0;while($i〈10){if($i%2==1){break;}echo$i;$i++;}echo〈br〉使用contine的输出效果:〈br〉;for($i=0;$i〈10;$i++){if($i%2){continue;}echo$i. ;}?〉〈/BODY〉〈/HTML〉5.1.8continuecontinue在循环结构用用来跳过本次循环中剩余的代码并开始执行下一次循环。注:注意在PHP中switch语句被认为是作为continue目的的循环结构。continue接受一个可选的数字参数来决定跳过几重循环到循环结尾。〈?phpwhile(list($key,$value)=each($arr)){if(!($key%2)){//skipoddmemberscontinue;}do_something_odd($value);}$i=0;while($i++〈5){echoOuter〈br〉\n;while(1){echo Middle〈br〉\n;while(1){echo Inner〈br〉\n;continue3;}echoThisnevergetsoutput.〈br〉\n;}echoNeitherdoesthis.〈br〉\n;}?〉5.1.9switchswitch语句和具有同样表达式的一系列的IF语句相似。很多场合下需要把同一个变量(或表达式)与很多不同的值比较,并根据它等于哪个值来执行不同的代码。这正是switch语句的用途。注意和其它语言不同,continue语句作用到switch上的作用类似于break。如果你在循环中有一个switch并希望continue到外层循环中的下一个轮回,用continue2。〈!--文件4-16.php:switch的应用--〉〈HTML〉〈HEAD〉〈TITLE〉switch的应用〈/TITLE〉〈/HEAD〉〈BODY〉〈?php//本程序测试时,请更改测试服务器的系统时间查看效果switch(date(D)){caseMon:echo今天星期一;break;caseTue:echo今天星期二;break;caseWed:echo今天星期三;break;caseThu:echo今天星期四;break;caseFri:echo今天星期五;break;default:echo今天放假;break;}?〉〈/BODY〉〈/HTML〉5.1.10return如果在一个函数中调用,return()语句立即结束此函数的执行并将它的参数作为函数的值返回。return()也会终止eval()语句或者脚本文件的执行。如果在全局范围中调用,则当前脚本文件中止运行。如果当前脚本文件是被include()的或者require()的,则控制交回调用文件。此外,如果当前脚本是被include()的,则return()的值会被当作include()调用的返回值。如果在主脚本文件中调用return(),则脚本中止运行。如果当前脚本文件是在php.ini中的配置选项auto_prepend_file或者auto_append_file所指定的,则此脚本文件中止运行。注:注意既然return()是语言结构而不是函数,并不需要用括号将参数括起来。事实上不用括号比用括号更常见,尽管用哪一种并无所谓。5.1.11require()require()语句包括并运行指定文件。有关包括如何工作的详细信息见include()的文档。require()和include()除了怎样处理失败之外在各方面都完全一样。include()产生一个警告而require()则导致一个致命错误。换句话说,如果你想在丢失文件时