自 PHP 5.4 起可用 callable 型別指定回呼類型 callback。本文檔基於同樣理由使用 callback 類型資訊。
有些函數如 call_user_func() 或 usort() 可以接受使用者自訂的回呼函數作為參數。回呼函數不只可以是簡單函數,還可以是物件的方法,包括靜態類別方法。
傳遞
一個 PHP 的函數以 string 型別傳遞其名稱。可以使用任何內建或使用者自訂函數,但除了語言結構例如: array() , echo , empty() , eval() , exit() , isset() , list() , exit() , isset() , list() , exit: 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 中,需要使用一個參考來建立一個指向具體物件的回呼函數,而不是一個拷貝。參見引用的解釋。
在函數中註冊有多個回呼內容時(如使用 call_user_func() 與 call_user_func_array() ),如在前一個回呼中有未捕獲的異常,其後的將不再被調用。
以上是php Callback 回呼函數詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!