自動目錄
何謂callback function?中文似乎沒有一個比較統一的翻譯,照字面翻是「召回函數」,或一稱「回呼函數」兩個名稱都好像不達意(不過算了不是上國文課)。它的目的簡單的說即回傳某個函數的指標, 呼叫者便可透過這個函數指標直接執行函數。例如 array_walk() 函數中的第二個參數就是 callback function。類型是 callable。
php可以使用 call_user_func()或 usort()函數來呼叫使用者自訂的callback fcunction
callback function本身也只是一個普通的函數或是類別中的靜態函數,以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');
上面的回呼函式如果要帶參數進去,可以使用第二個係數
function increment(&$var, $var2) { $var+=$var2; } $a = 3; $b=2; // 放在 array中代入,注意這裡面沒有回傳,而是顯示傳址的 $a call_user_func_array('increment', array(&$a,$b)); echo $a."\n"; //5
如果要把回呼函式的結果直接印出來,改成這樣即可
function increment($var, $var2) { return $var+=$var2; } $a = 3; $b=2; print call_user_func_array('increment', array(&$a,$b)); //5 echo $a."\n"; //3
另外[1]還有一個 closure 封裝的寫法(>PHP5.3),似乎是因為jquery而流行起來:
$cross = function($a,$b) { return $a * $b; }; // This is our range of numbers $num1 = range(1, 9); //1 2 3 4 5 6 7 8 9 $num2 = range(3, 12, 3); //3 6 9 12 // CALLBACK 函數的叫用方法 $ans = array_map($cross, $num1, $num2); //array of 3 12 27 48 0 0 0 0 0
closue函數的叫用
print $cross( 4, 2); //8
// 等同於CALLBACK 叫法
print call_user_func( $cross, 4, 2); //8
這種封裝的寫法本質上不容易閱讀,變數函數容易搞混,還是少用為妙
最後提到在類別中的方法中要怎麼呼叫自己類別中的函數作為CALLBACK函數,在這篇有提到,特別的是這樣就不必宣告該方法是靜態方法就能直接叫用。
參考資料
[1] PHP官網 http://php.net/manual/en/language.types.callable.php
編修原文 2013-10-07 12:54:29