自 PHP 5.4 起可用 callable 類型指定回呼類型 callback。本文檔基於同樣理由使用 callback 類型資訊。
一些函數如 call_user_func() 或 usort() 可以接受使用者自訂的回呼函數作為參數。回呼函數不只可以是簡單函數,還可以是物件的方法,包括靜態類別方法。
傳遞
一個 PHP 的函數以 string 類型傳遞其名稱。可以使用任何內建或使用者自訂函數,但除了語言結構例如: array(), echo, empty(), eval(), exit(), isset(), list(), print 或 unset()。
一個已實例化的對象的方法被作為數組傳遞,下標 0 包含該對象,下標 1 包含方法名。
靜態類別方法也可不經實例化該類別的物件而傳遞,只要在下標 0 中包含類別名稱而非物件。自 PHP 5.2.3 起,也可以傳遞 'ClassName::methodName'。
除了普通的使用者自訂函數外, create_function() 可以用來建立一個匿名回呼函數。自 PHP 5.3.0 起也可傳遞 closure 給回呼參數。
Example #1 回呼函數範例
<?php // An example callback function function my_callback_function() { echo 'hello world!'; } // An example callback method class MyClass { static function myCallbackMethod() { echo 'Hello World!'; } } // Type 1: Simple callback call_user_func('my_callback_function'); // Type 2: Static class method call call_user_func(array('MyClass', 'myCallbackMethod')); // Type 3: Object method call $obj = new MyClass(); call_user_func(array($obj, 'myCallbackMethod')); // Type 4: Static class method call (As of PHP 5.2.3) call_user_func('MyClass::myCallbackMethod'); // Type 5: Relative static class method call (As of PHP 5.3.0) 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 ?>
Example #2 使用 Closure 的範例
<?php // Our closure $double = function($a) { return $a * 2; }; // This is our range of numbers $numbers = range(1, 5); // Use the closure as a callback here to // double the size of each element in our // range $new_numbers = array_map($double, $numbers); print implode(' ', $new_numbers); ?>
以上程式會輸出:
2 4 6 8 10
Note: 在PHP 4 中,需要使用一個參考函數來建立一個特定物件的回調指向,而不是一個拷貝。參見引用的解釋。
Note:
在函數中註冊有多個回呼內容時(如使用 call_user_func() 與 call_user_func_array()),如在前一個回調中有未捕獲的異常,其後的將不再被調用。