PHP5.3 匿名函数 闭包函数
29
2014-01-16
匿名函数
function fname ( $a, $b, $c ) { return $a.$b.$c; } $var = 'fname'; echo $var(1,2,3); $niming = function( $a, $b, $c ){ return $a.$b.$c; }; // 必须加分号 echo $niming(1,2,3);
匿名函数可以当做参数传入普通函数。
/** * @url https://www.maosiji.com */ function demo( $fun ) { echo $fun(); } demo( function(){ return '3333'; }); /* 打印结果: 3333 */
闭包函数
子函数无法调用父函数的变量。
/** * @url https://www.maosiji.com */ $a = 500; function one() { $a = 100; echo '111'; function two() { global $a; echo "222 {$a}"; } two(); } /* 打印结果: 111 222500 */
在函数里调用一个匿名函数,并且调用它。
子函数使用use
关键字调用父函数定义的变量。
/** * @url https://www.maosiji.com */ function demo() { $a = '10'; $b = '100'; $one = function( $str ) use ($a, $b) { echo $str.$a.$b; }; $one('hello'); } demo(); /* 打印结果: hello10100 */
用use
传进来的变量相当于一个参数传进来,不是真正的变量。
在父函数中这个变量的值不变。
function demo() { $a = '10'; $b = '100'; $one = function( $str ) use ($a, $b) { $a++; echo $str.$a.$b.'
'; echo '匿名函数里的 a--'.$a.'
'; }; $one('hello'); echo '匿名函数外的 a--'.$a; } demo(); /* 打印结果: hello11100 匿名函数里的 a--11 匿名函数外的 a--11 */
如果想让use
传进来的变量,在父函数中的值也跟着匿名函数的操作变化,则用地址符&
。
/** * @url https://www.maosiji.com */ function demo() { $a = '10'; $b = '100'; $one = function( $str ) use (&$a, &$b) { $a++; echo $str.$a.$b.'
'; echo '匿名函数里的 a--'.$a.'
'; }; $one('hello'); echo '匿名函数外的 a--'.$a; } demo(); /* 打印结果: hello11100 匿名函数里的 a--11 匿名函数外的 a--11 */
真正的闭包函数。注意,变量a没有被释放,是递加的。闭包就是为了保护这个变量不被释放。
/** * @url https://www.maosiji.com */ function demo() { $a = '10'; $b = '100'; $one = function( $str ) use (&$a, &$b) { $a++; echo $str.$a.$b.'
'; }; return $one; } $var = demo(); $var( 'hello' ); $var( 'helloworld' ); $var( 'helloworld,maosiji' ); /* 打印结果: hello11100 helloworld12100 helloworld,maosiji13100 */
PHP闭包靠匿名函数实现。
将匿名函数在普通函数中当做参数传入,也可以被返回,这就实现了简单的闭包。
子函数可以使用父函数中的局部变量,这种行为叫闭包。
闭包两个特点:
1、作为一个函数变量的一个引用。当函数返回时,处于激活状态;
2、一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
3、闭包返回的函数内部不能用return
,因为会结束掉激活状态,也就不能保护变量不被释放了。
本文由 猫斯基 原创发布。
著作权均归用户本人所有。独家文章转载,请联系本站管理员。获得授权后,须注明本文地址! 本文地址:https://www.maosiji.com/2545.html