第五章 流程控制和函数.docx
- 文档编号:24248298
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:21
- 大小:100KB
第五章 流程控制和函数.docx
《第五章 流程控制和函数.docx》由会员分享,可在线阅读,更多相关《第五章 流程控制和函数.docx(21页珍藏版)》请在冰豆网上搜索。
第五章流程控制和函数
第一节流程控制
【视频文件:
流程控制】
任何PHP脚本都是由一系列语句构成的。
一条语句可以是一个赋值语句,一个函数调用,一个循环,甚至一个什么也不做的(空语句)条件语句。
语句通常以分号结束。
此外,还可以用花括号将一组语句封装成一个语句组。
语句组本身可以当作是一行语句。
本章讲述了各种语句类型。
5.1.1if
if结构是很多语言包括PHP在内最重要的特性之一,它允许按照条件执行代码片段。
如果$a大于$b,则以下例子将显示aisbiggerthanb:
〈?
php
if($a〉$b)
print"aisbiggerthanb";
?
〉
经常需要按照条件执行不止一条语句,当然并不需要给每条语句都加上一个if子句。
可以将这些语句放入语句组中。
例如,如果$a大于$b,以下代码将显示aisbiggerthanb并且将$a的值赋给$b:
〈?
php
if($a〉$b){
print"aisbiggerthanb";
$b=$a;
}
?
〉
if语句可以无限层地嵌套在其它if语句中,这给程序的不同部分的条件执行提供了充分的弹性。
5.1.2else
经常需要在满足某个条件时执行一条语句,而在不满足该条件时执行其它语句,这正是else的功能。
else延伸了if语句,可以在if语句中的表达式的值为FALSE时执行语句。
例如以下代码在$a大于$b时显示aisbiggerthanb,反之则显示aisNOTbiggerthanb:
〈?
php
if($a〉$b){
print"aisbiggerthanb";
}else{
print"aisNOTbiggerthanb";
}
?
〉
else语句仅在if以及elseif(如果有的话)语句中的表达式的值为FALSE时执行。
5.1.3elseif
elseif,和此名称暗示的一样,是if和else的组合。
和else一样,它延伸了if语句,可以在原来的if表达式值为FALSE时执行不同语句。
但是和else不一样的是,它仅在elseif的条件表达式值为TRUE时执行语句。
例如以下代码将根据条件分别显示aisbiggerthanb,aequaltob或者aissmallerthanb:
〈?
php
if($a〉$b){
print"aisbiggerthanb";
}elseif($a==$b){
print"aisequaltob";
}else{
print"aissmallerthanb";
}
?
〉
在同一个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.4while
while循环是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...while
do...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.6for
for循环是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.7break
break结束当前for,foreach,while,do..while或者switch结构的执行。
break可以接受一个可选的数字参数来决定跳出几重循环。
〈!
--文件4-18.php:
break/continue的应用--〉
〈HTML〉
〈HEAD〉
〈TITLE〉break/continue的应用〈/TITLE〉
〈/HEAD〉
〈BODY〉
〈?
php
echo"使用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.8continue
continue在循环结构用用来跳过本次循环中剩余的代码并开始执行下一次循环。
注:
注意在PHP中switch语句被认为是作为continue目的的循环结构。
continue接受一个可选的数字参数来决定跳过几重循环到循环结尾。
〈?
php
while(list($key,$value)=each($arr)){
if(!
($key%2)){//skipoddmembers
continue;
}
do_something_odd($value);
}
$i=0;
while($i++〈5){
echo"Outer〈br〉\n";
while
(1){
echo" Middle〈br〉\n";
while
(1){
echo" Inner〈br〉\n";
continue3;
}
echo"Thisnevergetsoutput.〈br〉\n";
}
echo"Neitherdoesthis.〈br〉\n";
}
?
〉
5.1.9switch
switch语句和具有同样表达式的一系列的IF语句相似。
很多场合下需要把同一个变量(或表达式)与很多不同的值比较,并根据它等于哪个值来执行不同的代码。
这正是switch语句的用途。
注意和其它语言不同,continue语句作用到switch上的作用类似于break。
如果你在循环中有一个switch并希望continue到外层循环中的下一个轮回,用continue2。
〈!
--文件4-16.php:
switch的应用--〉
〈HTML〉
〈HEAD〉
〈TITLE〉switch的应用〈/TITLE〉
〈/HEAD〉
〈BODY〉
〈?
php
//本程序测试时,请更改测试服务器的系统时间查看效果
switch(date("D")){
case"Mon":
echo"今天星期一";
break;
case"Tue":
echo"今天星期二";
break;
case"Wed":
echo"今天星期三";
break;
case"Thu":
echo"今天星期四";
break;
case"Fri":
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()则导致一个致命错误。
换句话说,如果你想在丢失文件时停止处理页面,那就别犹豫了,用require()吧。
include()就不是这样,脚本会继续运行。
同时也要确认设置了合适的include_path。
基本的require()例子:
〈?
php
require'prepend.php';
require$somefile;
require('somefile.txt');
?
〉
注:
由于这是一个语言结构而非函数,因此它无法被“变量函数”调用。
5.1.12include()
include()语句包括并运行指定文件。
以下文档也适用于require()。
这两种结构除了在如何处理失败之外完全一样。
include()产生一个警告而require()则导致一个致命错误。
换句话说,如果你想在遇到丢失文件时停止处理页面就用require()。
include()就不是这样,脚本会继续运行。
同时也要确认设置了合适的include_path。
当一个文件被包括时,其中所包含的代码继承了include所在行的变量范围。
从该处开始,调用文件在该行处可用的任何变量在被调用的文件中也都可用。
Includes()和required()的区别,includes()会产生警告后忽略错误继续执行程序,required()在产生错误的时候会停止执行程序。
第二节函数
【视频文件:
函数】
5.2.1用户自定义函数
一个函数可由以下的语法来定义:
展示函数用途的伪码
〈?
php
functionfoo($arg_1,$arg_2,...,$arg_n)
{
echo"Examplefunction.\n";
return$retval;
}
?
〉
任何有效的PHP代码都有可能出现在函数内部,甚至包括其它函数和类定义。
〈!
--文件4-19.php:
函数的定义和调用=〉求阶乘--〉
〈HTML〉
〈HEAD〉
〈TITLE〉函数的定义和调用=〉求阶乘〈/TITLE〉
〈/HEAD〉
〈BODY〉
〈?
php
functionfactorial($n)
{
$result=1;
for($i=2;$i〈=$n;$i++)
$result*=$i;
return$result;
}
for($i=1;$i〈=6;$i++)
{
$num=factorial($i);
echo$i."!
=".$num."〈br〉";
}
?
〉
〈/BODY〉
〈/HTML〉
在PHP3中,函数必须在被调用之前定义。
而PHP4则不再有这样的条件。
除非函数如以下两个范例中有条件的定义。
如果一个函数以以下两个范例的方式有条件的定义,其定义必须在调用之前完成。
有条件的函数:
〈?
php
$makefoo=true;
/*Wecan'tcallfoo()fromhere
sinceitdoesn'texistyet,
butwecancallbar()*/
bar();
if($makefoo){
functionfoo()
{
echo"Idon'texistuntilprogramexecutionreachesme.\n";
}
}
/*Nowwecansafelycallfoo()
since$makefooevaluatedtotrue*/
if($makefoo)foo();
functionbar()
{
echo"Iexistimmediatelyuponprogramstart.\n";
}
?
〉
函数中的函数:
〈?
php
functionfoo()
{
functionbar()
{
echo"Idon'texistuntilfoo()iscalled.\n";
}
}
/*Wecan'tcallbar()yet
sinceitdoesn'texist.*/
foo();
/*Nowwecancallbar(),
foo()'sprocessesinghas
madeitaccessable.*/
bar();
?
〉
PHP不支持函数重载,可能也不支持取消定义或者重定义已声明的函数。
5.2.2函数的参数
通过参数列表可以传递信息到函数,该列表是以逗号作为分隔符的变量和常量列表。
PHP支持按值传递参数(默认),通过引用传递,和默认参数值.可变长度参数列表仅在PHP4和后续版本中支持;更多信息请参照可变长度参数列表和涉及到的相关函数func_num_args(),func_get_arg(),和func_get_args()。
PHP3中通过传递一个数组参数可以达到类似的效果:
向函数传递数组:
〈?
php
functiontakes_array($input)
{
echo"$input[0]+$input[1]=",$input[0]+$input[1];
}
?
〉
(一)通过引用传递参数
缺省情况下,函数参数通过值传递(因而即使在函数内部改变参数的值,它并不会改变函数外部的值)。
如果你希望允许函数修改它的参数值,你必须通过引用传递参数。
如果想要函数的一个参数总是通过引用传递,你可以在函数定义中该参数的前面预先加上符号(&):
用引用传递函数参数:
〈?
php
functionadd_some_extra(&$string)
{
$string.='andsomethingextra.';
}
$str='Thisisastring,';
add_some_extra($str);
echo$str;//outputs'Thisisastring,andsomethingextra.'
?
〉
(二)默认参数的值
函数可以定义C++风格的标量参数默认值,如下:
函数中默认参数的用途:
〈?
php
functionmakecoffee($type="cappuccino")
{
return"Makingacupof$type.\n";
}
echomakecoffee();
echomakecoffee("espresso");
?
〉
上述片断的输出是:
Makingacupofcappuccino.
Makingacupofespresso.
默认值必须是常量表达式,不是(比如)变量,类成员,或者函数调用。
请注意当使用默认参数时,任何默认参数必须放在任何非默认参数的右侧;否则,可能函数将不会按照预期的情况工作。
考虑下面的代码片断:
函数默认参数不正确的用法:
〈?
php
functionmakeyogurt($type="acidophilus",$flavour)
{
return"Makin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第五章 流程控制和函数 第五 流程 控制 函数