[精讚] [會員登入]
2041

[PHP] 如何寫callback function 召回函數(回呼函數)

PHP如何寫召回函數或回呼函數(callback function)?

此文完整連結 http://n.sfs.tw/10707

複製連結 [PHP] 如何寫callback function 召回函數(回呼函數)@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2017-02-13 02:00:51 最後編修
2017-01-31 11:40:34 By 張○○
 

何謂callback function?中文似乎沒有一個比較統一的翻譯,照字面翻是「召回函數」,或一稱「回呼函數」兩個名稱都好像不達意(不過算了不是上國文課)。它的目的簡單的說即回傳某個函數的指標, 呼叫者便可透過這個函數指標直接執行函數。例如 array_walk() 函數中的第二個參數就是 callback function。類型是 callable。

bool array_walk ( array &$array , callable $callback [, mixed $userdata = NULL ] )

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

你可能感興趣的文章

[PHP] 如何寫callback function 召回函數(回呼函數) PHP如何寫召回函數或回呼函數(callback function)?

[PHP7] 利用Memcached 儲存 Session Memcached+ PHP7,利用Memcached 儲存 Session。

設定Google analytics API #3 -- 查詢範例 讓你的網站能夠存取你的Google analytics上面的資料

[PHP] 2個程式的觀念 整理2個PHP的程式觀念,參考參考。

[PHP] 字串拆解函數substr 奇異的錯誤(札記) 偶然發現一個 substr函數拆解上的怪異之處

[CodeIgniter 3] 資料庫的使用方法整理2/2 CI3 承襲 CI2,有很多的builder class可以用,依各人的使用習慣,有人喜歡一堆sql字串,有人喜歡用helper

[PHP] 使用browscap檢查瀏覽器版本 使用PHP內建函數browscap檢查瀏覽器版本

[CI3] 使用和修改日曆類別 calendar library CI3有一個日曆圖書館 library,可以快速的建立一個日曆,但是想修改讓他更棒

[PHP] 檢查檔案是否是圖檔 使用getimagesize函數檢查檔案是否是圖檔

[Centos 6& 7] 安裝php-geoip php-geoip是PHP由domain、ip查詢城市國家資料非常強的函式

我有話要說


限制:留言最高字數1000字,超過部分會被截掉。請注意:留言不可帶有網址,會被濾掉。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

[jQuery] 利用load()來達成ajax的寫法 jQuery中利用load()來達成ajax的寫法,也有人稱他是假的ajax,作法就是..

[bc] linux 的計算機 bc 設定小數位數、計算π、次方根 linux 的計算機 bc 設定小數位數、計算π、次方根

好用的3+2碼郵遞區號查詢系統推薦 網路上找到用地址輸入判斷3+2碼郵遞區號的辨識率不高,除了這個網站…

詭異的創業思維 創業的思維中,有多少銀彈,有多少技術,有多少人脈,有多少時間等等,每個都要考慮進去,以熱忱建立的關係脆弱的像蘇打餅乾一樣..

正則表達式:Email名稱防止連續輸入點(.)及下底線(_) Email的名稱中要允許特殊符號,但又不允許連續出現的正則表達式