PHP5.3 匿名函数 闭包函数

猫斯基  — PHP


匿名函数

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://maosiji.com
 */
function demo( $fun ) {
	
	echo $fun();
	
}

demo( function(){
	return '3333';
});


/*
打印结果:
3333
*/

闭包函数

子函数无法调用父函数的变量。

/**
 * @url https://maosiji.com
 */
$a = 500;

function one() {
	$a = 100;
	echo '111';
	function two() {
		global $a;
		echo "222 {$a}";
	}
	two();
}

/*
打印结果:
111
222500
*/

在函数里调用一个匿名函数,并且调用它。

子函数使用use关键字调用父函数定义的变量。

/**
 * @url https://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.'<br>';
		echo '匿名函数里的 a--'.$a.'<br>';
	};
	
	$one('hello');
	
	echo '匿名函数外的 a--'.$a;
	
}

demo();

/*
打印结果:
hello11100
匿名函数里的 a--11
匿名函数外的 a--11
*/

如果想让use传进来的变量,在父函数中的值也跟着匿名函数的操作变化,则用地址符&

/**
 * @url https://maosiji.com
 */
function demo() {
	
	$a = '10';
	$b = '100';
	
	$one = function( $str ) use (&$a, &$b) {
		$a++;
		echo $str.$a.$b.'<br>';
		echo '匿名函数里的 a--'.$a.'<br>';
	};
	
	$one('hello');
	
	echo '匿名函数外的 a--'.$a;
	
}

demo();

/*
打印结果:
hello11100
匿名函数里的 a--11
匿名函数外的 a--11
*/

真正的闭包函数。注意,变量a没有被释放,是递加的。闭包就是为了保护这个变量不被释放。

/**
 * @url https://maosiji.com
 */
function demo() {
	
	$a = '10';
	$b = '100';
	
	$one = function( $str ) use (&$a, &$b) {
		$a++;
		echo $str.$a.$b.'<br>';
	};
	
	return $one;
	
}

$var = demo();
$var( 'hello' );
$var( 'helloworld' );
$var( 'helloworld,maosiji' );

/*
打印结果:
hello11100
helloworld12100
helloworld,maosiji13100
*/

PHP闭包靠匿名函数实现。

将匿名函数在普通函数中当做参数传入,也可以被返回,这就实现了简单的闭包。

子函数可以使用父函数中的局部变量,这种行为叫闭包。

闭包两个特点:

1、作为一个函数变量的一个引用。当函数返回时,处于激活状态;
2、一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
3、闭包返回的函数内部不能用return,因为会结束掉激活状态,也就不能保护变量不被释放了。

阅读量:0 2021-01-22 16:36

返回顶部