[精讚] [會員登入]
1089

[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

你可能感興趣的文章

[PHP7] 讀取mysql資料庫的傳統方法 使用傳統預設的方法來連結mysql資料庫

PHP 數字加解密函式 自寫的數字加解密,勉強用

[PHP] 判斷程式是從CLI、本地網路或是網際網路端執行的方法 PHP利用IP判斷程式是從CLI、本地網路或是網際網路端執行的方法

[CodeIgniter3] 解決無法上傳特定檔案(.sb2)的問題 上傳時出現The filetype you are attempting to upload is not allowed,要怎麼解決?

[CodeIgniter 3] 取得controller和method的方法 CodeIgniter 3 取得controller和method的方法

[PHP8] 使用autoload autoload+ namespace +use 到了php7之後,namespace和use越來越重要,此篇整理autoload和namespace、use的結合使用。

隨機好文

UTF-8 BOM (Byte Order Mark) 的問題 在 Michael Kaplan 那看到 Every character has a story #4: U+feff

UTF-8的網頁但IE8一片空白 UTF8編碼的網頁在Firefox 正常顯示、但IE8 就是空白,IE8編碼設定是「自動偵測」可是自動偵測到的是 big5...

[MAC] 安裝APACHE+PHP OS Darwin OpenIDMac1deAir 15.6.0 Darwin Kernel Version 15.6.

此一時彼一時 我是不是易怒的人,其實我也不知道,總之我常會失控,不知道自己在幹嘛。這近生活過得浮浮的,不是很踏實,總會想太多,我甚至會

讓radio box 或checkbox 好按 在行動裝置下,radio box及checkbox變得很難按得到