摘要:匿名函数(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.在内存中维持一个变量,外层函数中的变量一直存在内存中,因此每次执行,都会使用到。
