Heim >Backend-Entwicklung >PHP-Tutorial >Detaillierte Erläuterung der Verwendung der Callback-Funktion der benutzerdefinierten PHP-Funktion

Detaillierte Erläuterung der Verwendung der Callback-Funktion der benutzerdefinierten PHP-Funktion

伊谢尔伦
伊谢尔伦Original
2017-06-26 11:01:432593Durchsuche

Ich entwickle kürzlich ein PHP-System. Um die Skalierbarkeit des Systems zu verbessern, möchte ich dem System beispielsweise einen Ereignisverarbeitungsmechanismus hinzufügen : Ich möchte dem System eine Nachricht hinzufügen. Nach dem Hinzufügen möchte ich das Protokoll mit Javascript-ähnlichem Code aufzeichnen. Es sollte wie folgt geschrieben werden:

Darunter die Funktion fnCallBack ist die
function fnCallBack( $news )
{
     //将$news的信息记录到日志中
    writeLog( $news->getTitle().' has been added successfully!');
}
$newsEventManager->addEventListener( 'add' , fnCallBack );
Callback-Funktion

, und addEventListener bedeutet, auf das Hinzufügungsereignis von newsEventManager zu hören. Wenn ein Nachrichtenartikel hinzugefügt wird, ruft das System die Funktion fnCallBack auf, um die Aktion writeLog abzuschließen. Allerdings unterscheidet sich die Funktionsübergabemethode in PHP stark von der in Javascript. In Javascript sind Funktionen ebenfalls Objekte und können problemlos als Parameter übergeben werden, in PHP jedoch nicht.

Der fnCallBack in der obigen Codezeile sieht aus wie das Handle dieser Funktion, aber tatsächlich ist es ein String und nicht die Funktion, die wir wollen.
$newsEventManager->addEventListener( 'add' , fnCallBack );

Um unser Ereignismodell zu implementieren, ist es notwendig, die Implementierungsmethode der Rückruffunktion von PHP zu untersuchen.

1.

Rückruf einer globalen Funktion

Die globale Funktion bedeutet hier eine Funktion, die direkt über die Funktion definiert wird. Sie ist in keinem Objekt oder einer Klasse enthalten. Bitte schauen Sie sich das folgende Beispiel an

Beispielcode:

Codebeschreibung:
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 );
Die in PHP integrierte Funktion call_user_func_array wird hier verwendet, um den Aufruf durchzuführen. call_user_func_array verfügt über zwei Parameter. Der erste Parameter ist eine Zeichenfolge, die den Namen der aufzurufenden Funktion angibt. Der zweite Parameter ist ein Array, das die Parameterliste angibt, die der Reihe nach an die aufzurufende Funktion übergeben wird.




2.

Rückrufe statischer Methoden einer Klasse

Was sollen wir tun, wenn die Methode, die wir zurückrufen möchten, eine statische Methode einer Klasse ist? Klasse? ? Wir können weiterhin die in PHP integrierte call_user_func_array-Methode verwenden, um Aufrufe zu tätigen. Sehen Sie sich bitte das Beispiel an:

Beispielcode:



Codebeschreibung:
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 );
Dieser Code ist derselbe wie der Erste Methode Der Code ist sehr ähnlich. Wir übergeben den Klassennamen (MyClass) als ersten Parameter von call_user_func_array, um den Rückruf der statischen Methode der Klasse zu implementieren. Beachten Sie, dass der erste Parameter von call_user_func_array zu diesem Zeitpunkt ein Array ist. Das erste Element des Arrays ist der Klassenname und das zweite Element ist der Name der aufzurufenden Funktion


3 Methode

Versuchte zuerst die aufrufende Methode in der primitivsten Zeichenfolgenform, wie unten gezeigt:



Der Aufruf war erfolgreich, aber wie werden die Parameter params an diese Methode übergeben? Wenn Parameter direkt übergeben werden, werden sie als Parameter verwendet. Wie teilt man die Parameter auf und übergibt sie?
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();
Ich habe im

PHP-Handbuch
nachgesehen und die Funktion „create_function“ gefunden. Diese Methode kann Zeichenfolgen verwenden, um eine anonyme Funktion zu erstellen . Rufen Sie in dieser anonymen Funktion unsere Rückruffunktion auf und übergeben Sie die Parameter. Erstellen Sie zunächst manuell eine anonyme Funktion anonym. Verwenden Sie in dieser Funktion die Methode, die ich zuvor gelernt habe, um die Rückruffunktion aufzurufen, wie unten gezeigt:


Dann verwende ich create_function Um diese anonyme Funktion zu erstellen, sollten gleichzeitig params[0] und params[1] im Code dynamisch generiert werden. Der Code lautet wie folgt:
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; );
function anonymous()
{
    global $myobj;
    global $fnName;
    global $params;
    $myobj->$fnName( $params[0] , $params[1] );
}
anonymous();


Dieser Code kann Definieren Sie eine anonyme Funktion und speichern Sie sie in der Variablen $anonymous. Rufen Sie diese schließlich $anonymous auf, um den Methodenrückruf zu implementieren.
$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();

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung der Callback-Funktion der benutzerdefinierten PHP-Funktion. 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