<p>回調可以通過 callable 類型聲明(míng)來(lái)表示。
一些(xiē)函數如 call_user_func() 或 usort() 可以接受用(yòng)戶自(zì)定義的回調函數作(zuò)爲參數。回調函數不止可以是簡單函數,還可以是對(duì)象的方法,包括靜态類方法。
傳遞 ¶
PHP是将函數以string形式傳遞的。 可以使用(yòng)任何内置或用(yòng)戶自(zì)定義函數,但(dàn)除了(le)語言結構例如:array(),echo,empty(),eval(),exit(),isset(),list(),print 或 unset()。
一個已實例化的 object 的方法被作(zuò)爲 array 傳遞,下(xià)标 0 包含該 object,下(xià)标 1 包含方法名。 在同一個類裏可以訪問 protected 和(hé) private 方法。
靜态類方法可以不實例化 object 傳遞,隻需要在下(xià)标爲 0 的位置傳遞類名而不是 object ,或者傳遞 'ClassName::methodName'。
回調參數不僅可以使用(yòng)普通的用(yòng)戶自(zì)定義函數,也(yě)接受 匿名函數 和(hé) 箭頭函數。
注意:
從(cóng) PHP 8.1.0 開(kāi)始,還可以使用(yòng) First-class 可調用(yòng)語法 創建匿名函數。
通常情況下(xià),任何實現(xiàn)了(le) __invoke() 的對(duì)象都可以傳入回調參數。
示例 #1 回調函數示例
<?php
// 回調函數示範
function my_callback_function() {
echo 'hello world!';
}
// 回調方法示範
class MyClass {
static function myCallbackMethod() {
echo 'Hello World!';
}
}
// 類型 1:簡單的回調
call_user_func('my_callback_function');
// 類型 2:靜态類方法回調
call_user_func(array('MyClass', 'myCallbackMethod'));
// 類型 3:對(duì)象方法回調
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
// 類型 4:靜态類方法回調
call_user_func('MyClass::myCallbackMethod');
// 類型 5:父級靜态類回調
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,從(cóng) PHP 8.2.0 起棄用(yòng)。
// 類型 6:實現(xiàn) __invoke 的對(duì)象用(yòng)于回調
class C {
public function __invoke($name) {
echo 'Hello ', $name, "\n";
}
}
$c = new C();
call_user_func($c, 'PHP!');
?>
示例 #2 使用(yòng) Closure 的示例
<?php
// 閉包
$double = function($a) {
return $a * 2;
};
// 這(zhè)是數字範圍
$numbers = range(1, 5);
// 這(zhè)裏使用(yòng)閉包作(zuò)爲回調,
// 将範圍内的每個元素數值翻倍
$new_numbers = array_map($double, $numbers);
print implode(' ', $new_numbers);
?>
以上(shàng)例程會(huì)輸出:
2 4 6 8 10
注意:
在函數中注冊有多個回調内容時(shí)(如使用(yòng) call_user_func() 與 call_user_func_array()),如在前一個回調中有未捕獲的異常,其後的将不再被調用(yòng)。</p>
網站(zhàn)建設開(kāi)發|APP設計(jì)開(kāi)發|小(xiǎo)程序建設開(kāi)發