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