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