php闭包函数(一)

袁志蒙 次浏览

摘要:匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。当然,也有其它应用的情况。子函数可以使用父函数的局部变量,这种行为叫做闭包...

匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。当然,也有其它应用的情况。

通俗的说:子函数可以使用父函数的局部变量,这种行为叫做闭包.

PHP版本要求:PHP5.3+


闭包是由匿名函数实现的,所以先声明一个匿名函数:

// 匿名函数因为没有名字,如果使用它,必须将其返回一个变量
$var = function ($value){
	echo $value;
};	//一定要加分号结束

$var('test');
// 运行结果: test

var_dump($var);
// $var它是Closure类的一个对象实例
// $var变量名后面有(),实际调用__invoke()方法

如果我们要使用这个匿名函数之外的变量,如以下代码,我们要使用use语言结构:

function demo(){
	
	$a = 10;
	$b = 20;
	$var = function($value) use ($a, $b) {
		echo $value.' and '.$a.' and '.$b;
	};
	
	$var('hello');
}

demo();

//运行结果: hello and 10 and 20

在匿名函数中改变外部变量(父函数变量)的值:

function demo(){
	
	$a = 10;
	$b = 20;
	
	// use 引用的变量是 $a,$b 的副本,如果要完全引用,就要加上 & 符号。
	$var = function($value) use (&$a, &$b) {
		echo $value.' and '.$a.' and '.$b;
		$a ++;
		$b ++;
	};
	
	$var('hello');
	echo '<br>';
	echo $a.'<br>';
	echo $b.'<br>';
}

demo();
// 运行结果:
// hello and 10 and 20
// 11
// 21

将匿名函数返回,实现一个真正的闭包:

function demo(){
	
	$a = 10;
	
	// 将匿名函数返回
	return function($value) use (&$a) {
		echo $value.'<br>';
		$a ++;
		echo $a.'<br><br>';
	};

}
$var = demo();

// 闭包函数返回时,该函数的内部变量处于激活状态,函数所在栈区依然保留
$var('hello');
$var('test');
$var('value');

// 运行结果:
// hello
// 11

// test
// 12

// value
// 13

闭包的应用场景:

1.保护函数内的变量安全,外层函数中变量只有内部函数才能访问,无法通过其他途径访问到,因此保护了外层函数中变量的安全性。

2.在内存中维持一个变量,外层函数中的变量一直存在内存中,因此每次执行,都会使用到。


随机新闻

表情

共0条评论
  • 这篇文章还没有收到评论,赶紧来抢沙发吧~