首頁 後端開發 php教程 php自訂函數的回呼函數用法詳解

php自訂函數的回呼函數用法詳解

Jun 26, 2017 am 11:01 AM
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 &#39;msg2:&#39;.$msg2;
}
$fnName = "fnCallBack";
$params = array( &#39;hello&#39; , &#39;world&#39; );
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 &#39;msg1:&#39;.$msg1;
        echo "<br />\n";
        echo &#39;msg2:&#39;.$msg2;
    }
}
$className = &#39;MyClass&#39;;
$fnName = "fnCallBack";
$params = array( &#39;hello&#39; , &#39;world&#39; );
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 = &#39;abc&#39;;
    public function fnCallBack( $msg1 = &#39;default msg1&#39; , $msg2 = &#39;default msg2&#39; )
    {
        echo &#39;object name:&#39;.$this->name;
        echo "<br />\n";
        echo &#39;msg1:&#39;.$msg1;
        echo "<br />\n";
        echo &#39;msg2:&#39;.$msg2;
    }
}
$myobj = new MyClass();
$fnName = "fnCallBack";
$params = array( &#39;hello&#39; , &#39;world&#39; );
$myobj->$fnName();
登入後複製

呼叫是成功了,不過如何把參數params傳給這個方法呢,如果把params直接傳進去,那麼它會當作1個參數,要怎麼把params拆開來傳進去呢?
查了一下PHP手冊,找到了create_function函數,這個方法可以用字串來創建一個匿名函數,好,有思路了,可以創建一個匿名的函數,在這個匿名函數中,呼叫我們的回呼函數,並把參數傳進去。

先手動建立一個匿名函數anonymous,在這個函數中,用前面試出來的方法呼叫回呼函數,如下所示:

class MyClass
{
    private $name = &#39;abc&#39;;
    public function fnCallBack( $msg1 = &#39;default msg1&#39; , $msg2 = &#39;default msg2&#39; )
    {
        echo &#39;object name:&#39;.$this->name;
        echo "<br />\n";
        echo &#39;msg1:&#39;.$msg1;
        echo "<br />\n";
        echo &#39;msg2:&#39;.$msg2;
    }
}
$myobj = new MyClass();
$fnName = "fnCallBack";
$params = array( &#39;hello&#39; , &#39;world&#39; );
function anonymous()
{
    global $myobj;
    global $fnName;
    global $params;
    $myobj->$fnName( $params[0] , $params[1] );
}
anonymous();
登入後複製

然後,我用create_function來創建這個匿名函數,同時,程式碼中的params[0],params[1]應該是動態產生的,程式碼如下:

$strParams = &#39;&#39;;
$strCode = &#39;global $myobj;global $fnName;global $params;$myobj->$fnName(&#39;;
for ( $i = 0 ; $i < count( $params ) ; $i ++ )
{
    $strParams .= ( &#39;$params[&#39;.$i.&#39;]&#39; );
    if ( $i != count( $params )-1 )
    {
        $strParams .= &#39;,&#39;;
    }
}
$strCode = $strCode.$strParams.");";
$anonymous = create_function( &#39;&#39; , $strCode);
$anonymous();
登入後複製

這段程式碼可以定義一個匿名函數,並保存在$ anonymous變數中,最後呼叫這個$anonymous,實作了方法的回呼。

以上是php自訂函數的回呼函數用法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

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

CakePHP 日期和時間 CakePHP 日期和時間 Sep 10, 2024 pm 05:27 PM

為了在 cakephp4 中處理日期和時間,我們將使用可用的 FrozenTime 類別。

討論 CakePHP 討論 CakePHP Sep 10, 2024 pm 05:28 PM

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

CakePHP 檔案上傳 CakePHP 檔案上傳 Sep 10, 2024 pm 05:27 PM

為了進行文件上傳,我們將使用表單助理。這是文件上傳的範例。

CakePHP 建立驗證器 CakePHP 建立驗證器 Sep 10, 2024 pm 05:26 PM

可以透過在控制器中新增以下兩行來建立驗證器。

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

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

CakePHP 快速指南 CakePHP 快速指南 Sep 10, 2024 pm 05:27 PM

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

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

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

See all articles