Je développe récemment un système PHP afin d'améliorer l'évolutivité du système, je souhaite ajouter un mécanisme de traitement d'événements similaire à Javascript par exemple. : Je souhaite ajouter un message au système. Après avoir été ajouté, je souhaite enregistrer le journal en utilisant un code de type Javascript, il doit être écrit comme ceci :
function fnCallBack( $news ) { //将$news的信息记录到日志中 writeLog( $news->getTitle().' has been added successfully!'); } $newsEventManager->addEventListener( 'add' , fnCallBack );
Parmi eux, la fonction fnCallBack. est la fonction de rappel , et addEventListener signifie écouter l'événement d'ajout de newsEventManager. Lorsqu'un article d'actualité est ajouté, le système appellera la fonction fnCallBack pour terminer l'action writeLog.
Cependant, la méthode de passage de fonction en PHP est très différente de celle en Javascript. En Javascript, les fonctions sont aussi des objets, et elles peuvent être facilement passées en paramètres, mais pas en PHP.
$newsEventManager->addEventListener( 'add' , fnCallBack );
Le fnCallBack dans la ligne de code ci-dessus ressemble au handle de cette fonction, mais en fait c'est une chaîne et non la fonction que nous voulons.
Afin d'implémenter notre modèle d'événement, il est nécessaire d'étudier la méthode d'implémentation de la fonction de rappel de PHP.
1. Rappel de la fonction globale
La fonction globale signifie ici une fonction définie directement à l'aide de la fonction. Elle n'est incluse dans aucun objet ou classe. Veuillez regarder l'exemple suivant
Exemple de code :
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 );
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, indiquant le nom de la fonction à appeler. Le deuxième paramètre est un tableau, indiquant la liste des paramètres, qui sera transmise à la fonction à appeler dans l'ordre.
2. Rappels de méthodes statiques d'une classe
Et si la méthode que nous voulons rappeler est une méthode statique d'une classe ? Nous pouvons toujours utiliser la méthode call_user_func_array intégrée de PHP pour effectuer des appels, veuillez consulter l'exemple :
Exemple de code :
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 );
Description du code :
Ce code est le même que le première méthode Le code est très similaire. On passe le nom de la classe (MyClass) comme premier paramètre de call_user_func_array pour implémenter le rappel de la méthode statique de la classe. Notez que le premier paramètre de call_user_func_array est actuellement un tableau. 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
3. méthode
J'ai d'abord essayé la méthode d'appel sous la forme de chaîne la plus primitive, comme indiqué ci-dessous :
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();
L'appel a réussi, mais comment transmettre le paramètre params à cette méthode ? params est transmis directement, il sera utilisé comme paramètre. Comment diviser les paramètres et les transmettre ?
J'ai vérifié le Manuel PHP et j'ai trouvé la fonction create_function. Cette méthode peut utiliser des chaînes pour créer une fonction anonyme. OK, j'ai une idée, je peux créer une fonction anonyme. , dans cette fonction anonyme, appelez notre fonction de rappel et transmettez les paramètres.
Créez d'abord manuellement une fonction anonyme anonyme. Dans cette fonction, utilisez la méthode que j'ai apprise plus tôt pour appeler la fonction de rappel, comme indiqué ci-dessous :
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();
Ensuite, j'utilise create_function Pour créer cette fonction anonyme, en même temps, params[0], params[1] dans le code doivent être générés dynamiquement, le code est le suivant :
$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();
Ce code peut définissez une fonction anonyme, et enregistrez-la dans la variable $anonymous Enfin, appelez ceci $anonymous pour implémenter le rappel de méthode.
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!