PHP的回调函数其实和C,Java等语言的回调函数的作用是一模一样的,都是在主线程执行的过程中,突然跳去执行设置的回调函数; 回调函数执行完毕之后,再回到主线程处理接下来的流程; 而在PHP调用回调函数,不像C以及Java那样直接使用函数名作为函数参数,而是在PHP中使用函数对应的字符串名称执行。
无参数回调
<?php
function CallbackWithoutParam(){
echo "无参数回调函数执行"."\n";
}
function main($callback2){
echo "回调函数执行before"."\n";
$callback2();
echo "回调函数执行after"."\n\n";
}
main('CallbackWithoutParam');
//打印结果
回调函数执行before
无参数回调函数执行
回调函数执行after
全局回调函数
// call_user_func — 把第一个参数作为回调函数调用 // 第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。
function CallbackWithParam($a,$b){
echo "全局回调函数执行"."\n";
echo "$a<====>$b"."\n";
}
$fun = "CallbackWithParam";
call_user_func($fun,1,2);
call_user_func_array($fun, [1,2]);
//打印结果
全局回调函数执行
1<====>2
全局回调函数执行
1<====>2
匿名函数(闭包函数)
// PHP中的匿名函数,也叫闭包函数,允许指定一个没有名称的函数。最常用的就是回调函数的参数值。
$closureFunc = function($str){
echo "\n匿名函数执行\n".$str."\n";
};
$closureFunc("hello world!");
//打印结果
匿名函数执行
hello world!
闭包函数
//检测一个函数变量是否是一个闭包
$closure = function($name){
return sprintf("Hello %s", $name);
}
echo $closure("jerry");
// 检测$closure变量是否是一个闭包
var_dump($closure instanceof Closure);
// 传入参数,引用局部变量
$closureFunc2 = function($name){
$sex = '男';
$func = function($age)use($name,$sex){
echo "\n闭包函数执行\n"."$name--$sex--$age"."\n";
};
$func(23);
};
$func = $closureFunc2("LVFK");
//打印结果
闭包函数执行
LVFK--男--23
返回闭包函数
$closureFunc3 = function($name){
echo "\n"."返回闭包函数 return"."\n"."closureFunc3 ";
$sex = '男';
echo "$name+++$sex"."\n";
$func = function()use($name,$sex){
echo "$name--$sex"."\n";
};
return $func;
};
$func = $closureFunc3("LVFK");
$func();
$func();
//打印结果
闭包函数执行
LVFK--男--23
闭包改变上下文的值,需要引用传递
$closureFunc4 = function($name){
echo "\n"."闭包函数改变上下文值时需要引用传递"."\n";
$age = 1;
echo "$name+++$age"."\n";
$func = function()use ($name,&$age){
$age++;
echo "$name--$age"."\n";
};
return $func;
};
$func = $closureFunc4("LVFK");
$func();
$func();
$func();
//打印结果
闭包函数改变上下文值时需要引用传递
LVFK+++1
LVFK--2
LVFK--3
LVFK--4