Littéralement, le Reflection de paradigme est un processus par lequel un logiciel peut vous observer, apprendre comment il est développé et modifié automatiquement. Est-ce clair?. Déjà
.
Supposons que vous ayez une classe avec des attributs et des méthodes. Supposons maintenant que d'une autre classe pour une raison quelconque vous avez besoin de savoir quels sont les attributs et méthodes, c'est que la première classe. En outre, supposons que vous avez besoin de connaître les paramètres de chaque appel de méthode. Vous ne pouvez pas!. Eh bien, vous avez tort
, Oui vous le pouvez, le Reflection de paradigme est ce qui nous donne la solution et est livré en standard mis en œuvre en PHP avec les classes établies pour donner tout faire. Une sorte de reverse engineering.
Penser à quoi bon cela? Pourquoi ai-je besoin?. Eh bien, cela dépend de ce que vous voulez faire
. Probablement, si vous savez existe et que vous pouvez faire, une station de journée pour elle. Dans mon cas, j'avais besoin de créer un système dynamique d'énumérer un certain nombre de classes, des méthodes et de les exécuter avec tous ses paramètres, à savoir la liste de tous les paramètres d'une méthode dans un formulaire que les utilisateurs peuvent remplir et exécuter cette méthode la classe pour obtenir le résultat. Il pourrait faire charger dans une base de données toutes les classes, méthodes et attributs de ces derniers, mais nécessiterait un entretien terrible et tenir compte, en outre, chaque fois que vous changez quelque chose parce que le système est en développement. Réflexion nous donne une solution plus élégante.
Notre système se compose de quatre étapes:
- Dressez la liste des classes disponibles
- Une fois qu'une classe est sélectionnée, la liste de ses méthodes publiques.
- Lors du choix d'une méthode, la liste de ses paramètres dans un formulaire.
- Exécutez la méthode et renvoyer le résultat à l'utilisateur.
1) Liste des classes
Cette étape est simple et évident, dans mon cas, vient de mettre les fichiers dans le dossier dans lequel je garde toutes sortes, il n'y a pas de truc. Ne ferait que monter un combo sur un formulaire à l'utilisateur de choisir la classe d'essayer.
- false !== ( $entry = $d -> read ( ) ) ) { while (faux! == ($ entry = $ d -> read ())) {
- / / Les fichiers de classe sont les class.nombreClase.php de type
- $ext == 'php' ) { if ($ ext == 'php') {
- }
- }
- ( array ( "Escoge Clase" ) , $clases ) ; Classes $ = array_merge ( tableau ("Choisissez Class"), $ classes);
2) l'obtention d'une des méthodes de classe
Nous faisons maintenant l'utilisation de la classe ReflectionClass pour les méthodes publiques d'une classe. Il ya beaucoup plus de méthodes de cette classe de voir beaucoup de choses.
- isset ( $_GET [ 'clase' ] ) && file_exists ( "class." . $_GET [ 'clase' ] . ".php" ) ) { if ( isset ($ _GET ['class']) && file_exists ("class.". $ _GET ['class']. ". php")) {
- "clases/class." . $_GET [ 'clase' ] . ".php" ) ; require_once ("classes / classe». $ _GET ['class']. ". PHP.");
- ReflectionClass ( $_GET [ 'clase' ] ) ; $ Classe = new ReflectionClass ($ _GET ['class']);
- -> getMethods ( ) ; Méthodes $ = $ class -> getMethods ();
- $metodos as $m ) foreach ($ méthodes que m $)
- = $m -> name ; $ Méthodes [] = $ m -> nom;
- ( array ( "Escoge Método" ) , $methods ) ; Méthodes $ = array_merge ( tableau ("Select Method"), $ méthodes);
- }
Comme vous pouvez le voir, nous obtenons un autre tableau avec les méthodes publiques de la classe sélectionnée, prête à monter un autre combo avec les méthodes disponibles.
3) Obtention des paramètres d'un procédé
Connaissant maintenant la méthode et classe que vous voulez exécuter nous avons juste à comprendre leurs paramètres d'appel. Cela semble impossible, mais encore une fois l'API de réflexion vient à notre secours.
- ReflectionClass ( $_GET [ 'clase' ] ) ; $ Classe = new ReflectionClass ($ _GET ['class']);
- try {
- -> getMethod ( $method ) ; Asmth $ = classe -> getMethod ($ method);
- $asmth -> getParameters ( ) as $i => $param ) foreach ($ asmth -> getParameters () as $ i => $ param)
- = $param -> getName ( ) ; $ Paramètres [] = $ param -> getName ();
- ReflectionException $e ) { } } Catch (ReflectionException $ e) {}
- }
Nous avons encore un tableau des paramètres de la méthode. Nous avons juste besoin de monter un formulaire avec plusieurs champs de texte comme paramètres de la méthode pour l'utilisateur d'essayer.
4) Exécutez la méthode
Je vais encore compliquer les choses. Toutes mes classes ont mis en place un singleton , qui ne peut être instancié comme il
. Aurait pu faire quelque chose comme:
- [ 'clase' ] :: getInstancia ( ) ; $ Class = $ _GET ['class'] :: getInstancia ();
Mais PHP ne peut pas utiliser une variable dans le nom de la classe lors de l'appel d'une méthode statique, renvoyer une erreur :
Parse error: syntax error, T_PAAMAYIM_NEKUDOTAYIM inattendu
Ce qui a résulté de Hebrero
"double-virgule Unexpected", c'est-à-dire dans le côlon.
Si nous avions le singleton et non nécessaire à l'appel statique qui retourne l'instance, nous pourrions faire quelque chose comme:
- $_GET [ 'clase' ] ; $ Classe = new $ _GET ['class'];
- -> metodo ( $parametros ) ; $ Res = $ class -> method ($ parameters);
Mais nous aurions toujours un problème avec les paramètres que nous ne savons pas combien il y aller, nous pouvons mettre quelque chose de dynamique dans un appel direct à une méthode.
La première chose à faire est d'appeler getInstancia de ma classe nous retourner une instance à elle. Pour cela nous nous tournons vers la fonction call_user_func indiquant la classe et la méthode à exécuter.
- ( array ( $_GET [ 'clase' ] , 'getInstancia' ) ) ; $ Class = call_user_func ( tableau ($ _GET ['class'], 'getInstancia'));
Maintenant, exécutez la méthode correspondante de la classe instanciée et en passant les paramètres nécessaires dans un tableau, de sorte que peu importe combien d'entre eux que vous avez, seront tous dans une liste. Pour ce faire, nous utilisons ce temps call_user_func_array .
- $_GET as $name => $param ) { foreach ($ _GET que $ name => $ param) {
- $name != "clase" && $name != "method" && $name != "submit" ) if ($ nom! = "classe" && $ nom! = "méthode" && $ nom! = "submit")
- = $param ; $ Params [] = $ param;
- }
- ( array ( $class , $method ) , $params ) ; $ Res = call_user_func_array ( tableau ($ class, $ method), $ params);
C'est tout. Nous avons réussi à trouver les méthodes d'une classe, ses paramètres et exécuter sauver tous les problèmes que nous avons rencontrés.
J'espère que vous pouvez aider
.



















