[精讚] [會員登入]
989

[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中取出字串中特定的字數 要將字串,例如資料庫取出的TEXT,取出特定的字數

PHP判斷對方瀏覽器語系 多語系的網頁應該主動偵查瀏覽器的語系,配合使用者跳出合適的語系。

PHP程式經驗 #2 -- print和echo的差異 常在寫php的人一定會想知道echo和print這兩個函數有什麼不一樣 驗證 1. 比較print 和echo 函式的執

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

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

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

隨機好文

[Windows7] 移除IE10及移除IE11 Windows7 不得已的情況要移除IE11或IE10怎麼做?

魔球中小女孩唱的歌 The show 魔球中小女孩唱的歌 The show

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

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

在Centos7 下安裝 Wildfly10 wildfly以前叫JBoss,2014.11.20改名叫Wildfly,起始版本是Wildfly8,現在已經出到Wil