[精讚] [會員登入]
674

[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

你可能感興趣的文章

使用strcmp來判斷日期是否介於某日期之間 要比較現在日期是否在兩個日期之間,使用字串比對的方法

[PHP] 類別的繼承及建構子和解構子 PHP 類別的繼承及建構子和解構子

Smarty安裝 smarty 是著名的樣版引擎,非常的好用,用多了突然發現拿掉smarty反而不會寫php了,以下是安裝過程..

PHP 移除陣列中的元素 要移除陣列中的其中一項元素

[PHP] 位元運算 (Bitwise operation)及和PERL比較 PHP 的位元運算,及和PERL比較整理

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

我有話要說

>>

限制:留言最高字數1000字。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

沒有非誰做不可的事,也沒有不可被取代的人 沒有非誰做不可的事,也沒有不可被取代的人

[HP DL380G7] 生效啟動第3,4片網卡/開啟或關閉內建的網卡 HP DL380G7 預設第3,4片網卡裝完系統後找不到,難道是壞了?要怎麼辦?

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

Smarty安裝 smarty 是著名的樣版引擎,非常的好用,用多了突然發現拿掉smarty反而不會寫php了,以下是安裝過程..

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