Heim >Backend-Entwicklung >PHP-Problem >Verstehen Sie kurz die beiden Funktionen call_user_func und call_user_func_array

Verstehen Sie kurz die beiden Funktionen call_user_func und call_user_func_array

步履不停
步履不停Original
2019-06-06 16:06:531921Durchsuche

Verstehen Sie kurz die beiden Funktionen call_user_func und call_user_func_array

call_user_func(): Rufen Sie eine Rückruffunktion auf, um eine Zeichenfolge zu verarbeiten ,
Sie können anonyme Funktionen verwenden, Sie können benannte Funktionen verwenden, Sie können Klassen übergeben Methoden,
Bei Verwendung einer benannten Funktion müssen Sie nur den Namen der Funktion übergeben
Bei Verwendung einer Klassenmethode müssen Sie den Klassennamen und den Methodennamen übergeben
Der erste übergebene Parameter muss a sein Funktionsname oder eine anonyme Funktion oder eine Methode
Für andere Parameter können Sie einen Parameter oder mehrere Parameter übergeben, und diese Parameter werden automatisch an die Rückruffunktion übergeben
Und die Rückruffunktion kann diese Parameter abrufen Übergabe von Parametern
Gibt das von der Rückruffunktion verarbeitete Ergebnis zurück

  ① Übergeben Sie den Funktionsnamen und erhalten Sie die von call_user_func übergebenen Parameter über die formalen Parameter der Rückruffunktion

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

 ②Der Fall des Aufrufs anonymer Funktionen und der Übergabe von Parametern

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

 ③Die Rückruffunktion ist eine anonyme Funktion, und die anonyme Funktion hat keine Parameter und die Parameter werden über andere Methoden abgerufen

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

 ④Call...no namespace· ··The······Klassenmethode······

<?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····· Klassenmethode mit Namespace· ·········

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

Die call_user_func-Funktion ist eine Möglichkeit für PHP, auf anonyme Funktionen zu verweisen, die PHP zuweisen kann Anonyme Funktionen zu Variablen und Referenzen, aber anonyme Funktionen können über die Funktion call_user_func aufgerufen werden, wodurch auch verhindert wird, dass lokale Variablen global verschmutzt werden. Die von call_user_func aufgerufene Rückruffunktion ist nicht nur unsere benutzerdefinierte Funktion, sondern auch eine Systemfunktion, die PHP verarbeiten kann Beim Aufrufen dieser Systemfunktionen ist zu beachten, dass die von call_user_func übergebenen Parameter der Parameterübergabereihenfolge der Systemfunktion entsprechen müssen. Rufen Sie sie beispielsweise selbst auf und Explosionsfunktionen. Ich habe das folgende Beispiel ausprobiert und es ist machbar (php-Video-Tutorial)

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

Ähnlich wie die Funktion call_user_func gibt es auch eine Funktion call_user_func_array. Der Aufruf und die Funktion dieser Funktion sind im Grunde Der Unterschied zur Funktion call_user_func besteht darin, dass die Funktion call_user_func_array nur zwei Parameter übergeben kann. Der erste ist der Name der Callback-Funktion oder die Klassenmethode, und der zweite Parameter ist das Array Von hier aus ist die Funktion call_user_func_array tatsächlich dieselbe wie call_user_func. Der Unterschied zwischen call_user_func_array besteht darin, dass call_user_func_array eine Rückruffunktion zum Verarbeiten von Arrays verwendet, während call_user_func eine Rückruffunktion zum Verarbeiten von Zeichenfolgen verwendet. Dies ist der grundlegende Unterschied zwischen ihnen. Sie können versuchen, die Funktion call_user_func_array() selbst aufzurufen, da ihre Referenzen grundsätzlich gleich sind, sodass ich nicht mehr über call_user_func_array schreiben werde.

Das obige ist der detaillierte Inhalt vonVerstehen Sie kurz die beiden Funktionen call_user_func und call_user_func_array. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn