闭包
闭包函数也叫匿名函数,简单地说就是没有名称的函数,经常作为回调函数的参数。
简单应用
<?php
$test = function($a){
echo pow(2,$a);
};
$test(3); //print -- 8
use关键字
use关键字在闭包函数中的角色是让闭包函数使用非传参的变量,即让闭包函数有能力捕获外界变量。
<?php
$b = 3;
$test = function($a) use($b){
echo $a+$b;
};
$test(4); //print -- 7
注意: 闭包内所引用的变量不能被外部所访问(即,内部对变量的修改,外部不受影响),若想要在闭包内对变量的改变从而影响到上下文变量的值,需要使用&的引用传参。
<?php
$b = 3;
$test = function() use(&$b){
$b=9;
};
echo $b; //print -- 9
PHP的闭包类(Closure)
其实在PHP中定义一个闭包函数其实就是一个Closure类的实例;
<?php
$test = function($a) {
echo $a;
};
var_dump($test);
/*print --
object(Closure)#2 (1) {
["parameter"]=>
array(1) {
["$a"]=>
string(10) "<required>"
}
}*/
另外,Closure可以将其他类的实例绑定到Closure的实例中,进而操作其他类的私有变量等。
<?php
class Test
{
private $a = 1;
}
$test = new Test();
var_dump($test);
/*print --
object(Test)#2 (1) {
["a":"Test":private] => int(1)
}
*/
$func=Closure::bind(function () use ($test) {
$test->a = 8;
}, $test, test::class);
var_dump($func);
/*print --
object(Closure)#5 (2) {
["static"]=>
array(1) {
["test"]=>
object(Test)#2 (1) {
["a":"Test":private]=>
int(1)
}
}
}
*/
call_user_func($func);//执行闭包函数$func
var_dump($test);
//** 可以看到私有变量a的值被修改,1->8 **
/*print --
object(Test)#2 (1) {
["a":"Test":private]=>
int(8)
}
*/
回调
回调函数其实就是将一个函数作为另一个函数的参数,这样在一些场景下可以达到一些特定作用,其实回调在异步(js)中特别有用,用于捕获异步结果。
PHP自带很多回调函数:
call_user_func();
call_user_func_array();
//一些数组函数
array_reduce();
array_walk();等
我们也可以自己写回调函数,这样的形式在js中用的多,php并不多:
<?php
function a($a)
{
if($a>100){
return true;
}
return false;
}
function test($a,$b)
{
if($a($b)){
echo $b;
}else{
echo 50;
}
}
test('a',500);//print -- 500
test('a',20);//print -- 50