零起点php入门第10课-php函数(1)

Author: 陌小雨Date: 2015-09-09View: 67

函数是由一系列语句组成的一个独立而且功能完整的功能块。它可以用来完成一些指定的操作,并返回操作后的结果。使用函数可以简化代码结构,并降低代码编写工作量。

使用函数有两个最主要的优势:函数是一个完整而且独立的功能块,因而使用函数的代码结构更加清晰,可以明显增强代码的可读性;函数使得程序的可复用性非常强。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

从运行结果我们可以看出,函数成功交换了变量的值。