回調(diào)可以通過(guò) callable 類型聲明來(lái)表示。
一些函數(shù)如 call_user_func() 或 usort() 可以接受用戶自定義的回調(diào)函數(shù)作為參數(shù)?;卣{(diào)函數(shù)不止可以是簡(jiǎn)單函數(shù),還可以是對(duì)象的方法,包括靜態(tài)類方法。
PHP是將函數(shù)以string形式傳遞的。 可以使用任何內(nèi)置或用戶自定義函數(shù),但除了語(yǔ)言結(jié)構(gòu)例如:array(),echo,empty(),eval(),exit(),isset(),list(),print 或 unset()。
一個(gè)已實(shí)例化的 object 的方法被作為 array 傳遞,下標(biāo) 0 包含該 object,下標(biāo) 1 包含方法名。 在同一個(gè)類里可以訪問(wèn) protected 和 private 方法。
靜態(tài)類方法可以不實(shí)例化 object 傳遞,只需要在下標(biāo)為 0 的位置傳遞類名而不是
object ,或者傳遞 'ClassName::methodName'
。
回調(diào)參數(shù)不僅可以使用普通的用戶自定義函數(shù),也接受 匿名函數(shù) 和 箭頭函數(shù)。
注意:
從 PHP 8.1.0 開(kāi)始,還可以使用 First-class 可調(diào)用語(yǔ)法 創(chuàng)建匿名函數(shù)。
通常情況下,任何實(shí)現(xiàn)了 __invoke() 的對(duì)象都可以傳入回調(diào)參數(shù)。
示例 #1 回調(diào)函數(shù)示例
<?php
// 回調(diào)函數(shù)示范
function my_callback_function() {
echo 'hello world!';
}
// 回調(diào)方法示范
class MyClass {
static function myCallbackMethod() {
echo 'Hello World!';
}
}
// 類型 1:簡(jiǎn)單的回調(diào)
call_user_func('my_callback_function');
// 類型 2:靜態(tài)類方法回調(diào)
call_user_func(array('MyClass', 'myCallbackMethod'));
// 類型 3:對(duì)象方法回調(diào)
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
// 類型 4:靜態(tài)類方法回調(diào)
call_user_func('MyClass::myCallbackMethod');
// 類型 5:父級(jí)靜態(tài)類回調(diào)
class A {
public static function who() {
echo "A\n";
}
}
class B extends A {
public static function who() {
echo "B\n";
}
}
call_user_func(array('B', 'parent::who')); // A
// 類型 6:實(shí)現(xiàn) __invoke 的對(duì)象用于回調(diào)
class C {
public function __invoke($name) {
echo 'Hello ', $name, "\n";
}
}
$c = new C();
call_user_func($c, 'PHP!');
?>
示例 #2 使用 Closure 的示例
<?php
// 閉包
$double = function($a) {
return $a * 2;
};
// 這是數(shù)字范圍
$numbers = range(1, 5);
// 這里使用閉包作為回調(diào),
// 將范圍內(nèi)的每個(gè)元素?cái)?shù)值翻倍
$new_numbers = array_map($double, $numbers);
print implode(' ', $new_numbers);
?>
以上例程會(huì)輸出:
2 4 6 8 10
注意:
在函數(shù)中注冊(cè)有多個(gè)回調(diào)內(nèi)容時(shí)(如使用 call_user_func() 與 call_user_func_array()),如在前一個(gè)回調(diào)中有未捕獲的異常,其后的將不再被調(diào)用。