1、 第四章(第四章(项目四项目四)函数函数 学习指导学习指导 像 C 或 JAVA 语言一样,PHP 中的函数是被命名的一段独立代码,可以通过函数名进行调用,完成一系列预定义的操作,向调用程序返回结果。在日常开发中,如果有一个功能或者一段代码经常使用,则可以把它写成自定义函数,在需要的时候调用。需要频繁使用一段代码或重复执行某种操作时,可将其定义为函数。从而避免重复编写代码,提高效率。PHP 中的函数可以分成 3 种,分别是系统内置函数、自定义函数和变量函数。系统内置函数是 PHP 内部已经预定义好的函数,这些函数不需要用户定义,在编程过程中可以直接使用。例如前面我们使用过的 date()、pr
2、int_r()等都是 PHP 的内置函数。自定义函数是程序员根据实际需要编写的一段代码,和内置函数不同,自定义函数只有在定义之后才可以使用。变量函数类似于可变变量,其函数名是一个变量。一、一、函数的函数的定义定义 函数定义的基本格式是这样子的:其中,function 为 PHP 关键字,表示函数定义的开始。函数名应该是合法的 PHP 标识符,与变量名的区别是函数名前面不能使用$符号,函数名也不区分大小写。PHP 函数定义中可以不指定参数,也可以有多个参数,可以为参数指定默认值,带默认值的参数必须放在其他参数的后面。在函数体中,可在任意位置使用 return 从函数返回。return 将返回值传
3、递给调用函数的程序。若 return 不带参数,则函数没有返回值。请看下面这段代码:这里定义的 Power 函数有两个参数,第 1 个参数为 n,第 2 个参数 p 的默认值是 2,函数的作用是返回变量 n 的 p 次方。若省略第二个参数 p,则取其默认值 2,也就是求参数 n的平方。二、二、函数的调用函数的调用 函数通过函数名来调用并获得返回值。如果函数有带默认值的参数,则可省略该参数。省略的参数取其默认值。例如前面定义了 power 函数,下面这段代码调用了这个函数 3 次。第 1 行调用 power 函数,给出参数 n 为 3,省略了参数 p,则 p 取其默认值为 2,返回3 的平方,通
4、过 echo 输出函数值为 9。第 2 行调用 power 函数,给出参数 n 为 2,参数 p,为 3,函数值为 2 的 3 次方,通过 echo 输出函数值为 8。第 3 行调用 power 函数,给出参数 n 为 5,省略了参数 p,则 p 取其默认值为 2,函数值为 25,但并没有输出或作用这个值。函数的调用和函数定义可以在同一个 PHP 文件中,也可分别放在不同的文件中。在同一个 PHP 文件中,函数的调用和函数定义出现的先后顺序没有关系。当然,一般情况是将函数定义放在函数调用之前。如果函数定义放在其他的 PHP 文件中,则应在调用函数之前,使用 include、或 requir等语
5、句包含该文件。请看下面这个例题。在 test1_1.php 中定义了一个字符串运算函数 strpower(),代码如下。这里定义了 strpower 函数,它有两个参数,分别是 n 和 p,其中 p 的默认值为 2。函数体通过 for 循环将字符串 n 重复 p 次,然后返回。主文件 test1.php 中定义了算术运算函数 power(),并调用 power()和 strpower()函数,代码如下。test1.php 中定义的算术运算函数 power(),同样有两个参数 n 和 p,p 的默认值也为 2。power 函数是求 n 的 p 次方返回。主程序中右花括号后的 include_on
6、ce 语句将 test1_1.php 文件包含进来;第一次调用 power 函数,参数 n 等于 3,p 省略其值为 2,得到函数值为 9,输出 9;下一行调用 power 函数,参数 n 等于 2,p 省略其值为 3,得到函数值为 2 的 3 次方等于 8,输出 8 再下一行调用 strpower 函数,参数 n 为 3,p 省略其值取 2,得到函数值为 33,输出 33。再下一行调用 strpower 函数,参数 n 为 2,p 为 3,得到函数值为 222,输出 222。倒数第 2 行调用 strpower 函数,参数 n 为 abc,p 为默认值 2,得到函数值为 abcabc,输出
7、abcabc。最后一行调用 strpower 函数,参数 n 为 abc,p 为 3,得到函数值为 abcabcabc,输出abcabcabc。代码在 IE 浏览器中的显示结果如图所示。三、三、函数与变量作用范围函数与变量作用范围。变量的作用范围受其声明方式和声明位置影响。PHP 中的变量根据其作用范围作用范围可分为局局部变量和全局变量部变量和全局变量。根据变量的生命周期生命周期又可分为静态变量和动态变量静态变量和动态变量。1局部变量和全局变量局部变量和全局变量 通常,函数内部的变量是局部变量局部变量,其作用范围只能在函数内部,函数参数也是局部变量。函数之外的变量可称为全局变量全局变量,其作用
8、范围为当前 PHP 文件。例如下面这段代码:test()函数中用 echo 输出变量$var 的值。在调用 test()函数时,会输出 100 吗?答案是否定的。声明的代码在运行时会产生一个 Notice 错误,提示变量$var 没有定义。因为函数体外的全局变量,不能直接在函数内部使用,函数内部的同名局部变量会屏蔽外部的全局变量,所以在 test()函数内部引用变量$var 时,该变量还未定义,所以出错。在函数内部如果要使用函数外部的全局变量,可在函数中使用 global 关键字声明,我们来看这个程序:程序在函数 test 中,使用 global 关键字声明了变量$var,这段代码在运行时,调
9、用 test()函数会输出全局变量$var 的值 100。2静态变量与变量生命周期静态变量与变量生命周期 变量生命周期指该变量在内存中的存在时间。一般的局部变量和全局变量都是动态变量。动态变量的生命周期是指包含变量的代码运行的时间。函数内部的局部变量在函数调用时被创建,函数调用结束后变量则被释放。全局变量在 PHP 文件执行时存在,执行结束后被释放。静态变量是特殊的局部变量,用 static 关键字进行声明。静态变量在第一次调用函数时被创建,函数调用结束时仍保留在内存中,下次调用函数时继续使用。请看下面这个使用静态变量的例子,其代码如下。这段 PHP 代码中定义了一个 test()函数,这个函
10、数中定义了一个静态变量$a,初值为 0,下面一行将变量$a 的值加 1,再输出变量$a 的值。第 1 次调用 test()函数时,创建静态变量$a,初值为 0,然后变量$a 的值自加 1,下一行输出是第 1 次调用 test()函数;第 2 次调用 test()函数时,静态变量$a 的值已经存在并等于 1(不是 0),然后变量$a 的值自加 1,变为 2,下一行输出是第 2 次调用 test()函数;同样地,第 3 次调用 test()函数时,静态变量$a 的值已经存在并等于 2(不是 0),然后变量$a 的值自加 1,变为 3,下一行输出是第 3 次调用 test()函数;第 4 次调用 t
11、est()函数时,静态变量$a 的值已经存在并等于 3(不是 0),然后变量$a 的值自加 1,变为 4,下一行输出是第 4 次调用 test()函数;代码在 IE 浏览器中的显示结果如图所示 四四、函数函数参数传递参数传递 函数参数传递涉及参数的传值和传地址、参数个数变量、变量函数、回调函数、数组作参数等内容,下面分别进行介绍。1参数的传值与传地址参数的传值与传地址 在定义函数时指明的参数可称为形式参数(简称形参),在调用函数时给定的参数称为实际参数(简称实参)。在调用函数时,实参和形参之间发生参数传递。在定义函数参数时,参数变量名之前使用“&”符号可声明参数进行引用传递,即将实参的地址传递
12、给形参。未使用“&”符号,则声明的参数将获得实参的值。对引用传递,调用函数时,只能用变量作为实参。如果实参和形参之间是传地址,即访问同一内存单元,则可在函数调用结束后,通过实参获得函数中形参变量的值。例如使用传地址函数,代码如下。?php function test($a,&$b)$b=$a*$a;return;$n=2;$p=3;echo 调用函数前:$n=,$n;echo$p=,$p;test($n,$p);echo 调用函数后:$n=,$n;echo$p=,$p;程序首先定义了 test 函数,它有两个参数 a 和 b,其中第 2 个参数 b 前有&符号,所以是引用传递.主程序中定义了变
13、量 n 的值为 2,变量 p 的值为 3,调 test 函数后,因为在函数 test 中改变了参数 b 的值为 4,所以传地址的实在参数 p 的值也改变为 4,而 n 的值不会变化.上例代码在 IE 浏览器中的显示结果如图所示 2参数个数变量参数个数变量 在使用默认参数时,调用函数时默认参数可以省略。但默认参数只能在调用函数时省略,函数中参数的个数是固定不变的。PHP 还允许向函数传递个数不固定的参数,此时函数不声明参数,即可在函数中使用PHP 内部函数 func_get_args()获得传入的多个参数。func_get_args()函数返回一个包含传入参数的数组 例如使用不固定个数参数的函数
14、,代码如下。test 函数中通过内置函数 func_get_args()获得调用时的参数数组$a,然后依次输出参数的类型和值。test(1,2.5,”ab”,”cd”)这是 test 函数的调用,有 4 个参数,依次输出。上面代码在 IE 浏览器中的显示结果如图所示。3变量函数变量函数 变量函数指在变量中保存函数的名字并通过变量来调用函数,这样,在变量的值变化时,可调用不同的函数。例如 使用变量函数的代码如下。4回调函数回调函数 PHP 允许将函数作为参数传递给另一个函数,作为参数的函数称为回调函数。PHP提供了两个内置函数用于调用回调函数。call_user_func(函数名,回调函数参数
15、1,回调函数参数 2,);第 1 个参数为回调函数名称,可以用字符串或变量指定函数名称。而从第二个参数开始指依次传递给回调函数的参数。多出的参数会被忽略。call_user_func_array(函数名,参数数组);它与 call_user_func 函数的区别在于,回调函数的参数必须放在一个数组中,作为第二个参数。数组中多出的参数会被忽略。5数组参数数组参数 使用数组也可以作为函数参数,因为使用不多,我就不进行详细的介绍了,请同学们自己去查阅相关资料。6递归函数 递归函数是指在函数内部调用函数本身,请看下面这段代码:?PHP Function func($n)If($n=1)这段代码中,定义
16、了三个函数,test1(),test2()和 test3()。这三个函数都有一个参数$a,返回的值分别是变量$a 的值加 10、20 和 30。主程序中首先给变量$var 赋值为字符串”test1”,语句:echo“调用$var():”,$var(5);因为$var 的值为 test1,而 test1(5)=15;所以,输出的内容是:调用 test1():15 当变量$var 赋值为字符串”test2”,语句:echo“调用$var():”,$var(5);所以,输出的内容是:调用 test2():25 同样地,后面输出:调用 test3():35 return 1;else return$n*func(&n-1);echo func(5);程序中的 func 函数内部又调用了 func 函数,但参数 n 减 1 了。注意参数有变化,还有结束点。