做(zuò)自(zì)由與創造的先行(xíng)者

Callback / Callable 類型

PHP中文手冊

<p>回調可(kě)以通(tōng)過 callable 類型聲明(míng)來表示。

一(yī)些函數(shù)如(rú) call_user_func() 或 usort() 可(kě)以接受用戶自(zì)定義的回調函數(shù)作(zuò)為(wèi)參數(shù)。回調函數(shù)不止可(kě)以是簡單函數(shù),還可(kě)以是對象的方法,包括靜态類方法。

傳遞 ¶

PHP是将函數(shù)以string形式傳遞的。 可(kě)以使用任何內(nèi)置或用戶自(zì)定義函數(shù),但(dàn)除了(le)語言結構例如(rú):array(),echo,empty(),eval(),exit(),isset(),list(),print 或 unset()。

一(yī)個已實例化的 object 的方法被作(zuò)為(wèi) array 傳遞,下(xià)标 0 包含該 object,下(xià)标 1 包含方法名。 在同一(yī)個類裏可(kě)以訪問(wèn) protected 和(hé) private 方法。

靜态類方法可(kě)以不實例化 object 傳遞,隻需要(yào)在下(xià)标為(wèi) 0 的位置傳遞類名而不是 object ,或者傳遞 'ClassName::methodName'。

回調參數(shù)不僅可(kě)以使用普通(tōng)的用戶自(zì)定義函數(shù),也接受 匿名函數(shù) 和(hé) 箭頭函數(shù)。

注意:

從(cóng) PHP 8.1.0 開(kāi)始,還可(kě)以使用 First-class 可(kě)調用語法 創建匿名函數(shù)。

通(tōng)常情況下(xià),任何實現了(le) __invoke() 的對象都(dōu)可(kě)以傳入回調參數(shù)。

示例 #1 回調函數(shù)示例

<?php

// 回調函數(shù)示範

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:對象方法回調

$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 起棄用。

// 類型 6:實現 __invoke 的對象用于回調

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;

};

// 這(zhè)是數(shù)字範圍

$numbers = range(1, 5);

// 這(zhè)裏使用閉包作(zuò)為(wèi)回調,

// 将範圍內(nèi)的每個元素數(shù)值翻倍

$new_numbers = array_map($double, $numbers);

print implode(' ', $new_numbers);

?>

以上(shàng)例程會輸出:

2 4 6 8 10

注意:

在函數(shù)中注冊有多個回調內(nèi)容時(shí)(如(rú)使用 call_user_func() 與 call_user_func_array()),如(rú)在前一(yī)個回調中有未捕獲的異常,其後的将不再被調用。</p>

網站建設開(kāi)發|APP設計開(kāi)發|小程序建設開(kāi)發
下(xià)一(yī)篇:Mixed
上(shàng)一(yī)篇:Resource 資源類型