[精讚] [會員登入]
1192

[PHP] 類別中要怎麼使用callback function 召回函數(回呼函數)?

在類別中使用標準函數,若其中的callback 函數也是在類別中,該怎麼使用?

分享此文連結 //n.sfs.tw/10746

分享連結 [PHP] 類別中要怎麼使用callback function 召回函數(回呼函數)?@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2019-10-23 14:24:29 最後編修
2017-02-08 03:12:37 By 張○○
 

自動目錄

我在寫類別中的 array_walk 時遇到麻煩,因為要在類別中用到callback函數,這裡用arrayAddfix()為例:

錯誤寫法

array_walk( $chnnum, "arrayAddfix");  // 警告 array_walk() expects parameter 2 to be a valid callback, function 'arrayAddfix' not found or invalid function name ..
array_walk( $chnnum, "$this->arrayAddfix");  //注意 Notice:  Undefined property: Address::$arrayAddfix in ..
array_walk( $chnnum, "this::arrayAddfix");  //注意array_walk() expects parameter 2 to be a valid callback, class 'this' not found in ..

正確寫法

array_walk( $chnnum, "Address:arrayAddfix");  // 改成靜態函數,Address是我的類別名,正確。
array_walk( $chnnum, "self::arrayAddfix");  // 改成靜態函數,正確,最建議寫法。
array_walk( $chnnum,  array($this, "arrayAddfix")); 
// 結果正確[1],建議寫法。

範例

下面這個範例,是把我的中國字數字陣例 $chnnum在字尾加上中文字'段',執行完畢後,$chnnum這個陣例的內容全部會改變,注意這個操作是全在類別之中。

類別

class Address{
  var $chnnum = array("一","二","三","四","五","六","七");
  private function arrayAddfix(&$v){
     $v .="段";
  }
  public function addSec(){
    array_walk( $this->chnnum, "self::arrayAddfix");  // 一段
  }
}

第7行:這裡使用內建的 array_walk函數,此函數第二個參數需為callback function。我叫用類別中的arrayAddfix函驄,值得注意的是arrayAddfix()所代入的第一個參數是傳參參數,第3行:'&$v',array_walk會把 $chnnum的內容一個個代入到arrayAddfix()中直接修改

執行

$addr= new Address();
print_r($addr->chnnum);
$addr->addSec();
print_r($addr->chnnum);

結果

Array
(
    [0] => 一
    [1] => 二
    [2] => 三
    [3] => 四
    [4] => 五
    [5] => 六
    [6] => 七
)
Array
(
    [0] => 一段
    [1] => 二段
    [2] => 三段
    [3] => 四段
    [4] => 五段
    [5] => 六段
    [6] => 七段
)

結論

推薦最後面的寫法:

array_walk( $chnnum,  array($this, "arrayAddfix"));

延伸閱讀

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

參考資料

[1] http://stackoverflow.com/questions/3840294/how-do-i-use-a-class-method-as-a-callback-function

[2] array_walk()函數 http://www.w3school.com.cn/php/func_array_walk.asp


原文 2013-09-28 23:49:46 ,編修 2017-08-11

END

你可能感興趣的文章

[PHP] 將UTF8中文字轉成10進位或16進位數值 原本為了處理 preg_match 中文字的問題[2],用php把中文字轉換成10進位和6進位的數值編碼

[PHP] 處理mail 函式的標題中文字亂碼 PHP的mail函式若標題有中文字得先處理過,否則收信者會看到亂碼

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

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

作業上傳程式 提供學生作業上傳的程式

[CodeIgniter 3] 自寫找不到頁面(page404)的方法 使用CI3框架中如果找不到頁面,就會導到一個自定的404頁面,該怎麼做?

隨機好文

HP SAS硬碟leds燈號說明 HP SAS硬碟leds燈號(hp g7/g6系統適用)說明

安裝SPHINX支援中文 新版本的 sphinx 和舊版不同,網路上很多範例和教學是不能用的。此文是安裝和設定方法分享

NETCRAFT發現你的網站及作業系統 NETCRAFT可以發現你的網站及作業系統

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

設計的工作絕不接受比價 拿買陽春麵的價格想買牛肉麵,寧願倒掉也不賣