Maison >développement back-end >Problème PHP >Comprendre brièvement les deux fonctions call_user_func et call_user_func_array

Comprendre brièvement les deux fonctions call_user_func et call_user_func_array

步履不停
步履不停original
2019-06-06 16:06:531921parcourir

Comprendre brièvement les deux fonctions call_user_func et call_user_func_array

call_user_func() : Appelez une fonction de rappel pour traiter une chaîne ,
Vous pouvez utiliser des fonctions anonymes, vous pouvez utiliser des fonctions nommées, vous pouvez passer une classe méthodes,
Lors de l'utilisation d'une fonction nommée, il vous suffit de transmettre le nom de la fonction
Lors de l'utilisation d'une méthode de classe, vous devez transmettre le nom de la classe et le nom de la méthode
Le premier paramètre passé doit être un nom de la fonction, ou une fonction anonyme, ou une méthode
Pour les autres paramètres, vous pouvez passer un ou plusieurs paramètres, et ces paramètres seront automatiquement passés à la fonction de rappel
Et la fonction de rappel peut obtenir ces paramètres en passage des paramètres
Renvoie le résultat traité par la fonction de rappel

  ① Passe le nom de la fonction et obtient les paramètres passés par call_user_func via les paramètres formels de la fonction de rappel

<?php
//先引用后增加
function _call($call){
    //通过传参获取call_user_func传过来的参数
    echo $call++,&#39;<br/>&#39;;
    echo $call++,"<br/>";
}
//上面回调函数没有返回值,所以,这里就没有返回值,_call为上面的函数的名称
$re = call_user_func(&#39;_call&#39;,1);
//实验结果为 null,符合上面的结论
var_dump($re);

 ②Le cas de l'appel de fonctions anonymes et du passage de paramètres

<?php
//先增加后引用
call_user_func(function($call){
    echo ++$call,&#39;<br/>&#39;;
    echo ++$call,&#39;<br/>&#39;;
},1);//传给匿名函数的参数为···1···,执行的结果为2,3

 ③La fonction de rappel est une fonction anonyme, et la fonction anonyme n'a pas de paramètres et les paramètres sont obtenus par d'autres méthodes

$arg1 = &#39;first&#39;;
$arg2 = &#39;two&#39;;
$return = call_user_func(function(){
    $arg = func_get_arg(0); //func_get_arg函数作用:获取函数的第几个参数,必须要有参数,参数必须为函数参数的偏移量,0代表第一个参数
    $args = func_get_args();//func_get_args的作用:获取函数所有的参数
    if(func_num_args() == 1){//func_num_args函数的作用:获取函数参数的个数,注意,假如函数没有传参,该函数返回0
        return $args[0];
    }else{
        //用|把函数的参数组织成字符串
        return implode(&#39;|&#39;,$args);
    }
},$arg1,$arg2);
var_dump($return);

 ④Appel... pas d'espace de noms· ··La······Méthode de classe······

<?php
class Func{
    //静态方法
    static public function _func(){
        $str =  &#39;THE CLASS NAME IS &#39;.__CLASS__.&#39; AND CLASS STATIC METHOD IS &#39;.__METHOD__;
        if(func_num_args()){
            //获取函数参数,获取参数也可以通过给方法设置形参来获取,这里只是没给方法设置形参获取参数的情况
            $arg = func_get_arg(0);
            return $str.&#39; and argument is &#39;.$arg;
        }else{
            return $str;
        }
    }
    //普通方法
    public function __func($num){
        return $num ? $num+1:$num;
    }
}
//传递类的静态方法,有两种方式
//(1)种,传递····类名::方法名····
var_dump(call_user_func("Func::_func",&#39;hell world&#39;));//这里传递参数
//(2)种,传递类名和方法名的数组
var_dump(call_user_func(array(&#39;Func&#39;,&#39;_func&#39;)));//这里没有传参数
$num = 4;
$o = new Func;
//传递类普通方法必须用···数组···传递···该类的对象··和···方法名···
$return = call_user_func(array($o,&#39;__func&#39;),$num);
var_dump($return);

 ⑤Call····· Méthode de classe avec espace de noms ········

<?php
//定义类的命名空间
namespace Home;
class Space{
    //静态方法
    static public function _call($num){
        return $num +=10;
    }
    //普通方法
    public function _func(){
        return func_get_args();//返回函数的参数
    }
}
//针对静态方法,有两种调用方式
//1.可以用array(__NAMESPACE__.&#39;\类名&#39;,&#39;方法名&#39;)传递类方法,也就是:array(&#39;命名空间\类名&#39;,&#39;方法名&#39;)
$return = call_user_func(array(__NAMESPACE__.&#39;\Space&#39;,&#39;_call&#39;),10);
//2.可以用····    __NAMESPACE__.&#39;\类名::方法名&#39;    ···传递类方法,也就是:&#39;命名空间\类名::方法名&#39;
$return1 = call_user_func(&#39;Home\Space::_call&#39;,100);
var_dump($return);
var_dump($return1);
//针对普通方法,不用传入命名空间即可调用,如下
$o = new Space;
$return = call_user_func(array($o,&#39;_func&#39;),1,2,3,4,5);
var_dump($return);

La fonction call_user_func est un moyen pour php de faire référence à des fonctions anonymes. Contrairement à js, php peut attribuer. fonctions anonymes aux variables et références, mais les fonctions anonymes peuvent être appelées via la fonction call_user_func, ce qui empêche également les variables locales d'être globalement polluées. La fonction de rappel appelée par call_user_func n'est pas seulement notre fonction personnalisée, mais aussi une fonction système que PHP doit traiter. strings. , comme rtrim et burst. Lors de l'appel de ces fonctions système, il convient de noter que les paramètres passés par call_user_func doivent être conformes à l'ordre de passage des paramètres de la fonction système. Vous pouvez essayer de les appeler vous-même. et exploser les fonctions. J'ai essayé l'exemple suivant et c'est réalisable (tutoriel vidéo php)

<?php
$return = call_user_func(&#39;rtrim&#39;,&#39;sso;osoo;&#39;,&#39;;&#39;);
$return2 = call_user_func(&#39;explode&#39;,&#39;;&#39;,&#39;sso;osoo;&#39;);
var_dump($return);
var_dump($return2);

Semblable à la fonction call_user_func, il existe une fonction call_user_func_array L'appel et la fonction de cette fonction sont essentiellement les. Comme la fonction call_user_func., la différence est que la fonction call_user_func_array ne peut transmettre que deux paramètres. Le premier est le nom de la fonction de rappel, ou la fonction anonyme, ou la méthode de classe, et le deuxième paramètre est le tableau. ici qu'en fait, la fonction call_user_func_array est la même que La différence entre call_user_func est que call_user_func_array utilise une fonction de rappel pour traiter les tableaux, tandis que call_user_func utilise une fonction de rappel pour traiter les chaînes. Vous pouvez essayer d'appeler la fonction call_user_func_array() vous-même, car leurs références sont fondamentalement les mêmes, donc je n'écrirai pas plus sur call_user_func_array.

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