[精讚] [會員登入]
227

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

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

此文完整連結 http://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

你可能感興趣的文章

[PHP] 判斷文字、數字、文字加數字的方法 幾個PHP數字和文字操作上的小眉角:判斷文字、數字、文字加數字的方法

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

[PHP] 將字串的部分加上遮罩的函式 有些資料會想要隱藏部分的字元,例如身分證號或信用卡號、電話等。我寫了一個函式來完成這個功能。

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

設定Google analytics API #2 -- PHP的程式安裝和撰寫 讓你的網站能夠存取你的Google analytics上面的資料

使用Yahoo OAuth2 2/2 使用Yahoo OAuth2認證我的網頁

[phpmyadmin] 缺少 mcrypt 外掛,請檢查 PHP 設定 缺少 mcrypt 外掛,請檢查 PHP 設定,安裝php-mcrypt。

利用 php 木馬作為駭客攻擊的手法 利用 php 木馬作為駭客攻擊的手法

PHP程式經驗 #1 -- 靜態的物件比動態物件快 驗證 1. 使用動態物件函式 > 使用靜態物件函式。 2. 使用有宣告的靜態物件函式 > 使用動態無宣告的靜

[PHP] 陣列排序 sort, ksort, asort, usort... 簡單的記錄PHP的陣列排序,因為常常會用到。

我有話要說


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

訪客留言

[無留言]

隨機好文

[MAC] 截取螢幕畫面的方法 截取螢幕畫面的方法,在MAC中叫作螢幕快照,英文是screenshot

[jQuery] select 元件的取值及給值 html中的元件select,在jquery中要如何使用?

SELinux 常用指令和檔案 在Redhat系列中,Centos5以後加入了selinux,他並沒有這麼可怕,不必每次看到Selinux ,就想把他

一個邏輯的錯誤刪了全部檔案的經驗 今天本來想做一件很簡單的事,但卻足足浪費我多一倍的時間,再加上刪掉我全部的檔案,原因只是因為我自己的邏輯錯誤。

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