php 回呼函數的實現方法?

來源:互聯網
上載者:User

全域回呼函數:

這裡的全域函數的意思,是直接使用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個參數是一個數組,表示參數列表,按照順序依次會傳遞給要調用的函數。
效果如下:

類的靜態方法的回調:

如果我們要回調的方法,是一個類的靜態方法,那怎麼辦呢?我們依然可以利用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個元素是類名,第二個元素是要調用的函數名

運行結果:


(其實和第1種方法的結果是一樣的 ^_^ )
繼續研究
如果我用這種方法調用一個類的非靜態方法(也就是把static去掉),會出現什麼結果呢?請看下面代碼

class MyClass{    public 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 );

運行結果還是和一樣!

對象的方法的回調:

我先用最原始的字串形式的調用方法嘗試了一下,如下所示:

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函數,這個方法可以用字串來建立一個匿名函數,好,有思路了,可以建立一個匿名的函數,在這個匿名函數中,調用我們的回呼函數,並把參數傳進去。

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' );$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();

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.