6.5 函数
PHP的真正力量来自它的函数:它拥有超过1000个内建的函数。除了内建的PHP函数,用户还可以创建自己的函数。本节将介绍函数的相关概念。
6.5.1 认识函数
函数是将一段具有某种功能的语句写成独立的程序单元,然后给予特定的名称,有些程序语言将函数称为方法、子程序或者过程。函数具有以下优点。
(1)函数具有可重用性,一个函数被写好后,可以在程序中不同地方调用这个函数,而不必重新编写。
(2)函数的使用使程序更精简,从而提高程序的可读性。
函数也具有缺点:函数的使用会使程序的运行速度减慢,因为多了一道调用函数的手续。
6.5.2 自定义函数
在程序设计中,可以将一段经常使用的代码封装起来,在需要使用时直接调用,这就是函数。PHP中不仅提供了大量丰富的系统函数,还允许用户自定义函数。
1.函数定义
函数定义的语法如下。
function fun_name([$arg1 , $arg2 ,…, $argn]) { fun_body; //函数体,实现具体功能的代码 [return $value;] //返回值 }
其中:
(1)function是定义函数的关键字。
(2)fun_name是自定义函数的名字,必须是以字母或下划线开头,后面可以跟字母、数字或下划线。函数名代表整个函数,具有唯一性,因为PHP不支持函数重载,所以函数名不能重复,并且PHP中函数名是不区分大小写的。
(3)$arg1 , … , $argn是函数的参数,可以有一个或多个,也可以没有。其作用范围为函数体内局部变量。
(4)return $value是函数的返回值语句,根据函数功能可以有返回值,也可以没有返回值,没有返回值称为过程。函数执行到该语句即结束,因此不要在其后写任何代码。
2.函数的调用
函数只有被调用后才真正开始执行函数体中的代码,执行完毕返回调用函数位置继续向下执行。
(1)通过函数名实现调用,可以在函数声明之前调用,也可以在声明之后调用。
(2)如果函数有参数列表,可以通过传递参数改变函数内部代码的执行行为。
(3)如果函数有返回值,当函数执行完毕后函数名可当作保存返回值的变量使用。
6-43.php
<?php function fun($a) { echo $a*$a; } echo "5的平方是:"; fun(5); ?>
运行效果如图6-37所示。
3.函数返回值
只依靠函数来完成某些功能还不够,有时也需要使用函数执行后的结果。函数执行完毕后可返回一个值给它的调用者,这个值称为函数的返回值,通过return语句来实现。
return语句可以将函数的值传递给函数的调用者,同时也终止了函数的执行。return语句最多只能返回一个值,如果需要返回多个值,可以把要返回的值存入数组,返回一个数组;如果不需要返回任何值,而是结束函数的执行,可以只使用return。
6-44.php
<?php function fun($a) { return $a*$a; } echo "5的平方是:".fun(5); ?>
运行效果如图6-38所示。
4.函数的参数
函数在定义时如果带有参数,那么在函数调用时需要向函数传递数据。PHP支持函数参数传递的方式有按值传递、按引用传递和默认参数三种。
1)按值传递方式
按值传递是函数默认的参数传递方式,将实参的值复制到对应的形参中。该方式的特点:在函数内部对形参的任何操作,对实参的值都不会产生影响。
6-45.php
<?php $a=3; echo '函数调用前全局变量$a='.$a."<br/>"; function fun($a) { $a=$a+10; echo '函数执行时局部变量$a='.$a."<br/>"; } fun($a); echo '函数调用后全局变量$a='.$a; ?>
运行效果如图6-39所示。
2)按引用传递方式
按引用传递是将实参在内存中分配的地址传递给形参。该方式的特点:在函数内部的所有操作都会影响到实参的值。也就是说在函数内部修改了形参的值,函数调用结束后,实参的值也会发生改变。
引用传递方式需要函数定义时在形参前加上“&”号。
6-46.php
<?php $a=3; echo '函数调用前全局变量$a='.$a."<br/>"; function fun(&$a) { $a=$a+10; echo '函数执行时局部变量$a='.$a."<br/>"; } fun($a); echo '函数调用后全局变量$a='.$a; ?>
运行效果如图6-40所示。
3)默认参数
PHP中还支持在定义函数时可以为一个或多个形参指定默认值。默认值必须是常量表达式,也可以是NULL;并且当使用默认参数时,任何默认参数必须放在任何非默认参数的右侧。
6-47.php
<?php function fun($a,$b=50) { return $a+$b; } echo "fun(10)=".fun(10)."<br/>"; echo "fun(10,20)=".fun(10,20)."<br/>"; ?>
运行效果如图6-41所示。
6.5.3 函数和变量作用域
PHP中也有全局变量与局部变量的概念,并且具有相同的处理方法。PHP认可两种类型的变量作用域——函数作用域和页面作用域。函数作用域指此变量用于单个函数,这是变量通常的默认作用域;页面作用域是指变量应该用于整个页面,使用它时,需要用到global这个关键字。
6-48.php
<?php $a=1; $b=2; function sum() { global $a; $b=5; //局部变量 return $a+$b; //是将全局变量$a与局部变量$b的值相加 } echo "sum()执行结果:".sum(); ?>
运行效果如图6-42所示。
注意:如果在函数中全局变量与局部变量同名,有效的是局部变量。
6-49.php
<?php $a=1; $b=2; function sum() { global $a,$b; $b=5; //局部变量 return $a+$b; //是将全局变量$a与局部变量$b的值相加 } echo "sum()执行结果:".sum(); ?>
运行效果如图6-43所示。
在全局范围内访问变量的第二个办法,是用特殊的PHP自定义$GLOBALS数组。
6-50.php
<?php $a=1; $b=2; function sum() { $b=5; //局部变量 return $GLOBALS['a']+$b; //是将全局变量$a与局部变量$b的值相加 } echo "sum()执行结果:".sum(); ?>
运行效果如图6-44所示。
变量范围的另一个重要特性是静态变量。静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。
6-51.php
<?php function Test() { static $a = 0; echo $a."<br>"; $a++; } Test(); Test(); ?>
运行效果如图6-45所示。
6.5.4 函数高级应用
介绍了函数的定义与使用后,本节将讲解函数的高级应用。
1.递归函数
递归函数即自调用函数,在函数体内直接或间接地自己调用自己。通常此类函数体中会包含条件判断,以分析是否需要执行递归调用;并指定特定条件以终止递归动作。
6-52.php
<?php function jiecheng ($n) { if ($n-1>0) { return $n*jiecheng($n-1) ; } else { return 1; } } $n=5; echo "$n!=".jiecheng($n); ?>
运行效果如图6-46所示。
2.变量函数
在PHP中支持变量函数,也就是可以声明一个变量,通过变量来访问函数。如果一个变量名后有圆括号,PHP将寻找与变量的值同名的函数,并且将尝试执行它。
6-53.php
<?php function fun() { echo "函数fun被调用"; } $f="fun"; $f(); ?>
运行效果如图6-47所示。
3.函数的引用
函数参数的传递可以按照引用传递,这样可以修改实参的值。引用不仅可用于函数参数,也可以用于函数本身。对函数的引用,就是对函数返回值的引用。对函数的引用,是在函数名前加“&”符号来实现的。
6-54.php
<?php function &fun() { static $b=0; echo '$b:'.$b."<br/>"; return $b; } $f=&fun(); //$f与函数返回值$b对应同一个存储空间 echo '$f:'.$f."<br/>"; $f=5; fun(); ?>
运行效果如图6-48所示。