2013年7月20日

Callback 回呼類型

Callback 回呼類型

自PHP 5.4起可用callable型態指定回呼型態callback。
一些函數如call_user_func()或usort()可以接受使用者自行定義回呼函數作為參數。
回呼函數可以是簡單函數,也可以是物件的方法,包括靜態類別方法。

傳遞
一個PHP的函數以字串型態的方式傳遞其回呼函式的名稱。
可以使用任何內建或使用者自定義函數,但是除了語言結構例如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給回呼函數

<?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 "An";
    }
}
 
class B extends A {
    public static function who() {
        echo "Bn";
    }
}
 
call_user_func(array('B', 'parent::who')); // A
?>

使用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);
?>

Note:在PHP4中,需要使用一個參照來建立一個指向具體物件的回呼函數,而不是一個複製物件,參閱參照的解釋

Note:在函數中註冊多個回呼函數(如使用call_user_func()call_user_func_array()時,如果在前一個調用中有未捕捉的異常,其後將不再被調用。

沒有留言:

張貼留言