Maison  >  Article  >  développement back-end  >  Comment implémenter la fonction de rappel php ?

Comment implémenter la fonction de rappel php ?

怪我咯
怪我咯original
2017-06-19 13:09:451251parcourir

GlobalFonction de rappel :

La fonction globale signifie ici qu'elle est définie directement à l'aide de la fonction Function , qui n’est contenu dans aucun objet ou classe. Veuillez consulter l'exemple ci-dessous.

Exemple de code :

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 );

Description du code :
La fonction intégrée PHP call_user_func_array est utilisée ici pour effectuer l'appel. call_user_func_array a deux paramètres. Le premier paramètre est une chaîne , qui représente le nom de la fonction à appeler. Le deuxième paramètre est un tableau, qui représente la liste des paramètres, qui sera transmise à la fonction. être appelé dans l'ordre.
L'effet est le suivant :

Rappel de la méthode statique de la classe :

Si la méthode que nous voulons rappeler est une méthode statique d'une classe, alors que devons-nous faire ? Nous pouvons toujours utiliser la méthode call_user_func_array intégrée à PHP pour effectuer des appels. Veuillez voir l'exemple :

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 );

Description du code :

Ce code est très similaire au code de la première méthode. Nous allons Le nom de la classe (MyClass) est également transmis comme premier paramètre de call_user_func_array, et le rappel de la méthode statique de la classe peut être implémenté. Notez que le premier paramètre de call_user_func_array est un tableau à ce stade. Le premier élément du tableau est le nom de la classe et le deuxième élément est le nom de la fonction à appeler

Résultat de l'exécution :

(En fait, le résultat est le même que la première méthode ^_^)
Continuer à étudier
Si j'utilise cette méthode pour appeler une méthode non statique d'une classe (qui c'est-à-dire supprimer l'électricité statique), quel sera le résultat ? Veuillez consulter le code suivant

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 );
Le résultat en cours d'exécution est toujours le même que l'image ci-dessus !

Rappels de méthodes objets :

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

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn