php自訂函數的回呼函數用法詳解
最近在開發一個PHP系統,為了提高系統的擴充性,我想在系統中加入類似Javascript的事件處理機制,例如:我想在一篇新聞被加入以後,我想記錄日誌,用類似Javascript的程式碼,應該是這樣寫的:
function fnCallBack( $news ) { //将$news的信息记录到日志中 writeLog( $news->getTitle().' has been added successfully!'); } $newsEventManager->addEventListener( 'add' , fnCallBack );
其中,fnCallBack函數是回呼函數,addEventListener表示監聽newsEventManager的add事件。當一篇news被add以後,系統就會呼叫fnCallBack函數,從而完成writeLog的動作。
但是,PHP中的函數傳遞方法和Javascript有很大的不同。在Javascript中,函數也是對象,它可以很方便的當作參數傳遞,但是PHP不行。
$newsEventManager->addEventListener( 'add' , fnCallBack );
上面這行程式碼中的fnCallBack,看起來好像是那個函數的句柄,但實質上它是一個字串,並不是我們所要的函數。
為了實作我們的事件模型,有必要研究一下PHP的回呼函數的實作方法。
1. 全域函數的回呼
這裡的全域函數的意思,是直接使用function定義的函數,它不包含在任何物件或類別之中。請看下面的範例
範例程式碼:
function fnCallBack( $msg1 , $msg2 ) { echo 'msg1:'.$msg1; echo "<br />\n"; echo 'msg2:'.$msg2; } $fnName = "fnCallBack"; $params = array( 'hello' , 'world' ); call_user_func_array( $fnName , $params );
程式碼說明:
這裡使用了PHP內建的函數call_user_func_array來進行呼叫。 call_user_func_array有兩個參數,第1個參數是一個字串,表示要呼叫的函數名,第2個參數是數組,表示參數列表,依照順序依序會傳遞給要呼叫的函數。
2. 類別的靜態方法的回呼
如果我們要回呼的方法,是一個類別的靜態方法,那該怎麼辦呢?我們依然可以利用PHP內建的call_user_func_array方法來進行調用,請看範例:
範例程式碼:
class MyClass { public static function fnCallBack( $msg1 , $msg2 ) { echo 'msg1:'.$msg1; echo "<br />\n"; echo 'msg2:'.$msg2; } } $className = 'MyClass'; $fnName = "fnCallBack"; $params = array( 'hello' , 'world' ); call_user_func_array( array( $className , $fnName ) , $params );
程式碼說明:
這段程式碼和第1種方法的程式碼很相似,我們將類別名稱(MyClass)也當作call_user_func_array的第1個參數傳遞進去,就可以實作類別的靜態方法的回呼了。注意,這時call_user_func_array的第1個參數是一個陣列了,陣列的第1個元素是類別名,第二個元素是要呼叫的函數名
3. 物件的方法的回呼
先用最原始的字串形式的呼叫方法嘗試了一下,如下所示:
class MyClass { private $name = 'abc'; public function fnCallBack( $msg1 = 'default msg1' , $msg2 = 'default msg2' ) { echo 'object name:'.$this->name; echo "<br />\n"; echo 'msg1:'.$msg1; echo "<br />\n"; echo 'msg2:'.$msg2; } } $myobj = new MyClass(); $fnName = "fnCallBack"; $params = array( 'hello' , 'world' ); $myobj->$fnName();
呼叫是成功了,不過如何把參數params傳給這個方法呢,如果把params直接傳進去,那麼它會當作1個參數,要怎麼把params拆開來傳進去呢?
查了一下PHP手冊,找到了create_function函數,這個方法可以用字串來創建一個匿名函數,好,有思路了,可以創建一個匿名的函數,在這個匿名函數中,呼叫我們的回呼函數,並把參數傳進去。
先手動建立一個匿名函數anonymous,在這個函數中,用前面試出來的方法呼叫回呼函數,如下所示:
class MyClass { private $name = 'abc'; public function fnCallBack( $msg1 = 'default msg1' , $msg2 = 'default msg2' ) { echo 'object name:'.$this->name; echo "<br />\n"; echo 'msg1:'.$msg1; echo "<br />\n"; echo 'msg2:'.$msg2; } } $myobj = new MyClass(); $fnName = "fnCallBack"; $params = array( 'hello' , 'world' ); function anonymous() { global $myobj; global $fnName; global $params; $myobj->$fnName( $params[0] , $params[1] ); } anonymous();
然後,我用create_function來創建這個匿名函數,同時,程式碼中的params[0],params[1]應該是動態產生的,程式碼如下:
$strParams = ''; $strCode = 'global $myobj;global $fnName;global $params;$myobj->$fnName('; for ( $i = 0 ; $i < count( $params ) ; $i ++ ) { $strParams .= ( '$params['.$i.']' ); if ( $i != count( $params )-1 ) { $strParams .= ','; } } $strCode = $strCode.$strParams.");"; $anonymous = create_function( '' , $strCode); $anonymous();
這段程式碼可以定義一個匿名函數,並保存在$ anonymous變數中,最後呼叫這個$anonymous,實作了方法的回呼。
以上是php自訂函數的回呼函數用法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

CakePHP 是 PHP 的開源框架。它旨在使應用程式的開發、部署和維護變得更加容易。 CakePHP 基於類似 MVC 的架構,功能強大且易於掌握。模型、視圖和控制器 gu

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

CakePHP 是一個開源MVC 框架。它使應用程式的開發、部署和維護變得更加容易。 CakePHP 有許多函式庫可以減少大多數常見任務的過載。

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲
