匿名函数
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,因为会结束掉激活状态,也就不能保护变量不被释放了。