php 回呼函數的實作方法?

怪我咯
發布: 2023-03-10 19:50:01
原創
1259 人瀏覽過

全域回呼函數

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

 

類別的靜態方法的回呼:

   






###########################################################################################################################################################################如果我們要回呼的方法,是一個類別的靜態方法,那該怎麼辦呢?我們依然可以利用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個元素是類別名,第二個元素是要呼叫的函數名######執行結果:###### ######(其實和第1種方法的結果是一樣的 ^_^ )###繼續研究###    如果我用這個方法呼叫一個類別的非靜態方法(也就是把static拿掉) ,會出現什麼結果呢?請看下面程式碼######
class MyClass
{
    public 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 );
登入後複製
###運行結果還是跟上圖一樣! #########物件的方法的回呼:##########

我先用最原始的字符串形式的调用方法尝试了一下,如下所示:

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函数,这个方法可以用字符串来创建一个匿名函数,好,有思路了,可以创建一个匿名的函数,在这个匿名函数中,调用我们的回调函数,并把参数传进去。

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; );
$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();
登入後複製

以上是php 回呼函數的實作方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!