PHP 回调函数
1. 什么是回调函数?
回调函数(通常简称为“回调”)是作为参数传递给另一个函数的函数。
在 PHP 中,回调函数不仅限于简单的功能实现,它们常用于实现插件系统、事件处理或在处理数组等集合数据时自定义操作逻辑。
2. 在回调函数中使用命名函数
任何现有的命名函数都可以作为回调传递。要将函数用作回调,只需传递一个包含函数名称的字符串作为另一个函数的参数即可。
在下例中,我们使用 PHP 的内置函数 array_map(),它会将回调函数应用于数组的每个元素,并返回一个包含处理结果的新数组:
代码示例:
<?php
function my_callback($item) {
return strlen($item);
}
$strings = ["apple", "orange", "banana", "coconut"];
// 将函数名作为字符串传递
$lengths = array_map("my_callback", $strings);
print_r($lengths);
?>3. 在回调函数中使用匿名函数
从 PHP 5.3 开始,您可以将匿名函数(也称为闭包)作为回调传递。这种方式在回调逻辑仅需使用一次时非常方便,因为它不需要在全局命名空间中定义函数。
代码示例:
<?php
$strings = ["apple", "orange", "banana", "coconut"];
// 传递匿名函数
$lengths = array_map( function($item) { return strlen($item); } , $strings);
print_r($lengths);
?>4. 在用户自定义函数中使用回调函数
您也可以在自己编写的函数中接受回调作为参数。为此,只需在函数内部使用 call_user_func() 函数来执行传入的回调。
call_user_func() 的第一个参数是回调函数的名称(字符串)或匿名函数,后续参数则是传递给该回调的参数值。
4.1 示例:实现自定义格式化逻辑
在下例中,我们创建了一个名为 ask 的函数,它接受一个回调作为参数,并使用该回调来格式化输出内容:
代码示例:
<?php
function exclaim($str) {
return $str . "! ";
}
function ask($str) {
return $str . "? ";
}
function printFormatted($str, $format) {
// 使用 call_user_func 调用传入的 $format 函数
echo call_user_func($format, $str);
}
// 传递 "exclaim" 作为回调
printFormatted("Hello World", "exclaim");
// 传递 "ask" 作为回调
printFormatted("Hello World", "ask");
?>关于可调用对象(Callable): > 在 PHP 7+ 中,您可以在函数参数中对回调进行类型声明。使用 callable 类型提示可以确保传入的参数确实是一个可以被调用的函数、匿名函数或方法。function executeCallback(callable $callback) {
$callback();
}