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 diefunction fnCallBack( $news ) { //将$news的信息记录到日志中 writeLog( $news->getTitle().' has been added successfully!'); } $newsEventManager->addEventListener( 'add' , fnCallBack );
, 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.
$newsEventManager->addEventListener( 'add' , fnCallBack );
Um unser Ereignismodell zu implementieren, ist es notwendig, die Implementierungsmethode der Rückruffunktion von PHP zu untersuchen.
1.
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:
function fnCallBack( $msg1 , $msg2 ) { echo 'msg1:'.$msg1; echo "<br />\n"; echo 'msg2:'.$msg2; } $fnName = "fnCallBack"; $params = array( 'hello' , 'world' ); call_user_func_array( $fnName , $params );
2.
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:class MyClass { public static function fnCallBack( $msg1 , $msg2 ) { echo 'msg1:'.$msg1; echo "<br />\n"; echo 'msg2:'.$msg2; } } $className = 'MyClass'; $fnName = "fnCallBack"; $params = array( 'hello' , 'world' ); call_user_func_array( array( $className , $fnName ) , $params );
3 Methode
class MyClass { private $name = 'abc'; public function fnCallBack( $msg1 = 'default msg1' , $msg2 = 'default msg2' ) { echo 'object name:'.$this->name; echo "<br />\n"; echo 'msg1:'.$msg1; echo "<br />\n"; echo 'msg2:'.$msg2; } } $myobj = new MyClass(); $fnName = "fnCallBack"; $params = array( 'hello' , 'world' ); $myobj->$fnName();
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:
class MyClass { private $name = 'abc'; public function fnCallBack( $msg1 = 'default msg1' , $msg2 = 'default msg2' ) { echo 'object name:'.$this->name; echo "<br />\n"; echo 'msg1:'.$msg1; echo "<br />\n"; echo 'msg2:'.$msg2; } } $myobj = new MyClass(); $fnName = "fnCallBack"; $params = array( 'hello' , 'world' ); function anonymous() { global $myobj; global $fnName; global $params; $myobj->$fnName( $params[0] , $params[1] ); } anonymous();
$strParams = ''; $strCode = 'global $myobj;global $fnName;global $params;$myobj->$fnName('; for ( $i = 0 ; $i < count( $params ) ; $i ++ ) { $strParams .= ( '$params['.$i.']' ); if ( $i != count( $params )-1 ) { $strParams .= ','; } } $strCode = $strCode.$strParams.");"; $anonymous = create_function( '' , $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!