PHP回调函数及匿名函数概念与用法详解

103 阅读1分钟

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