函数是由一系列语句组成的一个独立而且功能完整的功能块。它可以用来完成一些指定的操作,并返回操作后的结果。使用函数可以简化代码结构,并降低代码编写工作量。
使用函数有两个最主要的优势:函数是一个完整而且独立的功能块,因而使用函数的代码结构更加清晰,可以明显增强代码的可读性;函数使得程序的可复用性非常强。PHP系统默认已经定义了多种类型的千余个函数,这些函数可以被任何一个PHP程序使用,这就是函数可复用性的最明显表现。
PHP中的函数分为两类,分别是系统函数和用户自定义函数。系统函数的使用比较简单,本节将重点介绍自定义函数的知识。
1、自定义函数和调用函数
自定义函数即为用户自己定义用来实现指定需求的函数。定义函数的一般形式如下所示:
function 函数名(参数列表){
函数体;
return 返回值;
}
定义函数需要使用function关键字;函数名是用来为这一系列操作定义的名称;参数列表是数据传入函数的入口;函数体是函数的注意功能实现部分;函数都有返回值,但在没有显式调用return语句返回一个值的时候,函数会默认返回空类型(void)。
<?php function add($x,$y){ //定义函数add return $x+$y; } echo add(15,6); //调用函数并输出结果 >
以上代码中,add是函数名;$x和$y是函数接受的参数;return后的表达式即为函数的返回值。函数调用的一般形式如下所示:
函数名(参数列表);
函数名即在函数定义时指定的名称,参数列表需要对应函数定义时的参数列表传入。
我们可以看到只要通过使用正确定义的函数名,我们就可以轻易得到相应的结果。
在上面的学习中我们已经认识到return可以将函数的运算结果返回。return语句也是跳转语句的一种,它会立刻终止当前函数的执行并返回结果。因此,return语句通常会放在整个函数体的最后。
2、函数的参数
函数的参数有实际参数和形式参数之分。形式参数即为一个形式,它只要可以保证参数可以正确地传递到函数体中即可。因此只要符合PHP命名规范的名称都可以使用。如下所示函数的功能是完全一致的:
function add($x,$y){ return $x+$y; } function add($a,$b){ //使用不同的形式参数 return $a+$b; } function add($abc,$def){ //使用不同的形式参数 return $abc+$def; }
函数在定义时可以为形式参数设定默认参数,默认参数的定义必须是从右向左,并且默认参数的右边不可有为设置默认参数的形式参数。如下所示是一些默认参数的示例:
function func($x,$y,$z=0){ //正确的默认参数设置方法 … } function func($x,$y=1,$z=0){ //正确的默认参数设置方法 … } function func($x=2,$y=1,$z=0){ //正确的默认参数设置方法 … } function func($x=2,$y=1,$x){ //错误的默认参数设置方法 … } function func($x=0,$y=1,$z){ //错误的默认参数设置方法 … }
在调用的时候传入的参数即为实际参数,它会从左向右依次传入函数的参数列表,设置默认值的参数将被替换。
<?php function add($x=2,$y=3){ //定义函数并设置默认参数 return $x+$y; } echo add(); //不传入参数调用add函数add(2,3) echo '<br />'.add(5); //传入一个参数调用add函数 echo '<br />'.add(5,6); //传入两个参数调用add函数 >
代码运行结果:
5
8
11
3、参数的传递
参数的传递类似于变量的赋值。PHP参数传递方式分为按值传递和按引用传递。类似的,按值传递将传递实际参数的副本,而引用传递则传递实际参数本身。
<?php function swap($x,$y){ //定义交换数值函数 $temp=$x; $x=$y; $y=$temp; } $m=5; $n=15; echo "交换前:<br />\$m=$m<br />\$n=$n"; //输出交换前变量的值 swap($m,$n); //调用函数交换变量数值 echo "<br />交换后:<br />\$m=$m<br />\$n=$n"; //输出交换后变量的值 >
代码运行结果:
交换前:
$m=5
$n=15
交换后:
$m=5
$n=15
从运行结果我们可以很明显看出,变量的值并没有被交换。而在函数内部确实实现了变量值的交换,我们可以通过以下代码来验证:
<?php function swap($x,$y){ //定义交换数值函数 echo "交换前:<br />\$x=$x<br />\$y=$y<br />"; //输出交换前的变量值 $temp=$x; $x=$y; $y=$temp; echo "交换后:<br />\$x=$x<br />\$y=$y"; //输出交换后的变量值 } swap(5,15); //调用函数并传入参数 >
代码运行结果:
交换前:
$x=5
$y=15
交换后:
$x=15
$y=5
从以上输出函数内部交换过程的运行结果来看,在函数内部确实成功交换了变量的值。这就再次证实了按值传递方式中函数操作的是实际参数的副本。类似于变量的赋值,我们同样可以将变量的本身作为参数传递给函数体,这类函数定义的方式如下所示:
function 函数名(&参数1,&参数2,&参数…){
函数体;
return 返回值;
}
<?php function swap(&$x,&$y){ //定义交换数值函数 $temp=$x; $x=$y; $y=$temp; } $m=5; $n=15; echo "交换前:<br />\$m=$m<br />\$n=$n"; //输出交换前变量的值 swap($m,$n); //调用函数交换变量数值 echo "<br />交换后:<br />\$m=$m<br />\$n=$n"; //输出交换后变量的值 >
代码运行结果:
交换前:
$m=5
$n=15
交换后:
$m=15
$n=5
从运行结果我们可以看出,函数成功交换了变量的值。