零起点php入门第11课-php函数(2)

Author: 陌小雨Date: 2015-09-10View: 18

这节课,陌小雨继续带大家学习php函数的其他内容。

1、变量的作用域

变量的作用域即变量可使用的范围。函数中变量的作用是即整个函数体内,因此在函数内部与外部的同名变量是不同的。

<?php	
	function add(){			//定义函数add
		$m=2;			//函数内部定义并初始化两个变量
		$n=3;
		return $m+$n;
	}
	$m=12;			//函数外部定义两个同名变量
	$n=8;
	echo '调用函数输出结果:'.add();
	echo '<br />函数外部输出结果:'.($m+$n);
?>

代码运行结果:

调用函数输出结果:5
函数外部输出结果:20

在代码中我们可以看到函数内和函数外的变量是不同的,否则函数外部输出结果也将是5而不是20。

<?php
	function print_num(){			//定义函数
		$x=6;			//在函数中定义变量
	}
	print_num();		//调用函数
	echo $x;
?>

代码运行结果:(无内容)

(代码在运行后输出了一个变量为定义的提示,这就证明了在函数外部不能够读取到函数内部定义的变量。)

2、全局变量

如果需要在函数中使用函数外的变量那么就需要使用global来声明一个全局变量,它的一般形式如下所示:

global 变量1,变量2,变量3…

<?php
	function test(){		//定义函数
		global $a;		//声明全局变量
        echo $a;		
	}
	$a=7;
	test();			//调用函数
?>

代码运行结果:7

从运行结果我们可以看到,虽然在函数中并没有定义变量a,但是调用函数时仍然输出了变量a的值,这就是global定义的作用。

3、静态变量

变量作用域的另一个体现就是静态变量。静态变量可以使函数中的变量状态保留而不会被销毁。首先看一段不使用静态变量的示例。

<?php
	function test(){		//定义函数
		$a=0;			//定义变量
		$a++;			//变量递增
		echo $a;		//输出变量值
	}
	test();			//第一次调用函数
	test();			//第二次调用函数
	test();			//第三次调用函数
?>

代码运行结果:111

以上输出结果证明了三次调用函数均输出1,也就是说函数中的变量a的值在每次调用中均会被初始化。

静态变量使用static关键字定义,形式如下所示:

static 变量名=初始值;

<?php
	function test(){		//定义函数
		static $a=0;			//定义静态变量
		$a++;			//变量递增
		echo $a;		//输出变量值
	}
	test();			//第一次调用函数
	test();			//第二次调用函数
	test();			//第三次调用函数
?>

代码运行结果:123

以上代码仅在之前的基础上定义了静态变量,但是输出结果却是不同的,这就是因为静态变量的状态会被保留因而可以实现递增

4、函数的其他使用方法

变量除了已经讲解的常用使用方法之外,还有一些其他的使用方法,包括函数的递归调用、可变函数、匿名函数和函数的引用返回。

(1)可变函数

可变函数是指以一个变量作为函数名来调用函数。因此同样的形式会随着变量值的改变而调用不同的函数,常用的形式如下所示:

$variable()

<?php
	function hello(){			//定义函数
		echo '<br />Hello!<br />';
	}
	function hellophp(){		//定义函数
		echo '<br />Hello PHP!<br />';
	}
	function good(){			//定义函数
		echo '<br />PHP is very good!<br />';
	}
	$func='good';			//定义变量func
	$func2='hello';			//定义变量func2
	$func();			//变量作为函数名good()
	$func2();			//变量作为函数名hello()
	$func='hellophp';		//对变量func重新赋值
	$func();		//变量作为函数名hellophp()
?>

代码运行结果:

PHP is very good!

Hello!

Hello PHP!

(2)函数的引用返回

函数的引用返回常用于使函数内的变量与函数外的变量建立联系,因而可以通过读取或者修改函数外变量的值来读取或者修改函数内的变量的值。引用返回的函数形式如下所示:

function &函数名(参数列表){
函数体;
return 返回值;
}

<?php
	function &test(){		//定义函数
		static $a=0;			//定义变量
		$a++;			//变量递增
		return $a;		//返回变量值
	}
	$quote=&test();			//建立联系
	echo "\$a=$quote";			//输出函数中变量a的值
	test();			//调用函数
	test();			//调用函数
	echo "<br />\$a=$quote";			//输出函数中变量a的值
	$quote=15;			//改变返回值$a的值
	test();			//调用函数
	echo "<br />\$a=$quote";			//输出函数中变量a的值
?>

代码运行结果:

$a=1
$a=3
$a=16

从运行结果我们可以看到,函数在外部就实现了静态变量a从3到16的跨越却只需要进行一次赋值。而不使用引用返回想要达到同样的结果就需要多次重复调用函数。

(3)函数的递归调用

函数的递归调用即在函数体内调用函数自身。通常的形式如下所示:

function func_name(…){
…;
func_name(…);
…;
}

下面就通过一个简单的题目来学习递归调用的使用方法,题目如下:初始情况下有一个细胞,它每2分钟会分裂出1个细胞。新生细胞有1分钟的成熟期,成熟后的细胞每2分钟会分裂出一个细胞。我们就来设计程序计算15分钟后共有多少细胞。

<?php
	function cell($start,$end){			//定义细胞函数,参数start为开始时间,end为结束时间
		global $sum;
		for($i=$start+1;$i<$end;$i=$i+2)
			if($i+2<=$end){
				cell($i+2,$end);		//递归调用
				$sum=$sum+1;
			}
	}
	$sum=1;
	cell(-1,35);		//由于开始时候是有一个成熟的细胞,因此需要将时间提前1分钟
	echo "15分钟后为$sum 个细胞。";
?>

递归调用是比较耗费系统资源的,虽然15分钟的细胞数可以很容易地计算出来,但是计算一个比较长的时间浏览器通常会响应比较长的时间。

(4)匿名函数

匿名函数也称为闭包函数,它是一个没有函数名的函数,通常会作为回调函数的参数,它的形式如下所示:

function (参数列表){
语句;
}

匿名函数也可以与一个变量绑定,常用形式如下所示:

$varable = function (参数列表){
语句;
}

匿名函数作为回调函数参数的知识陌小雨不在这里讲解,下面我们就以匿名函数与变量绑定的形式来学习。

<?php
	$func=function ($x,$y){			//匿名函数与变量绑定
		return $x+$y;
	};
	echo '5+6='.$func(5,6);			//使用匿名函数
	echo '<br />15+16='.$func(15,16);	
?>

代码运行结果:

5+6=11
15+16=31

在将匿名函数与变量绑定的时候需要注意在匿名函数结尾需要以分号结束,这类似于为变量赋值。

总结:陌小雨共通过两节课讲解了PHP函数部分的知识,包括使用函数的优势以及详细讲解了函数的各种使用方法。让大家使用函数时候基本没有盲点。函数的递归调用是初学者比较难掌握的知识,我们现在无需完全理解递归,递归的知识将在不断的学习和实践中会逐渐深入理解。