ホームページ  >  記事  >  バックエンド開発  >  PHPのコールバック関数を実装するにはどうすればよいですか?

PHPのコールバック関数を実装するにはどうすればよいですか?

怪我咯
怪我咯オリジナル
2017-06-19 13:09:451255ブラウズ

グローバルコールバック関数:

ここでのグローバル関数は、関数を使用して直接定義された関数を意味します。オブジェクトやクラスには含まれません。以下の例を参照してください。

サンプルコード:

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 には 2 つのパラメーターがあります。最初のパラメーターは呼び出される関数の名前を表す string です。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 );

コードの説明:

このコードは、最初のメソッドのコードとよく似ています。また、クラス名 (MyClass) も使用します。 call_user_func_array の 3 番目の要素にパラメータを 1 つ渡すことで、クラスの静的メソッドのコールバックを実装できます。このとき、call_user_func_array の最初のパラメータは配列であることに注意してください。配列の最初の要素はクラス名であり、2 番目の要素は呼び出される関数名です。 実行結果:

(実際には、最初の 1 つ目) メソッドの結果は同じです^_^)引き続き勉強してください
このメソッドを使用してクラスの非静的メソッドを呼び出すと (つまり、静的メソッドを削除すると)、結果はどうなりますか?以下のコードを見てください

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。