Letteralmente, la riflessione paradigma è un processo mediante il quale il software può osservare se stessi, imparare su come si è sviluppata e modificata automaticamente. È chiaro?. Già
.
Supponiamo di avere una classe con alcuni attributi e metodi. Ora supponiamo che da un'altra classe per qualsiasi motivo avete bisogno di scoprire quali attributi e metodi è in primo luogo quella classe. Inoltre, supponiamo che è necessario conoscere i parametri di ogni chiamata di metodo. Non è possibile!. Beh ti sbagli
, Sì, è possibile, la riflessione paradigma è quello che ci dà la soluzione e viene fornita di serie realizzato in PHP con le classi di dare tutto fatto. Una sorta di reverse engineering.
Pensare che cosa serve? Perché ne ho bisogno?. Beh, dipende da cosa si vuole fare
. Probabilmente se si sa che esiste e che si può fare, un resort di giorno ad esso. Nel mio caso avevo bisogno di creare un sistema dinamico di elencare qualsiasi numero di classi, metodi e di eseguirle con tutti i suoi parametri, cioè elencare tutti i parametri di un metodo in una forma che gli utenti possono compilare ed eseguire tale metodo la classe per ottenere il risultato. Si potrebbe fare il caricamento in un database tutte le classi, i metodi e gli attributi di questi, ma richiederebbe una manutenzione terribile e tener conto, inoltre, ogni volta che si cambia qualcosa, perché il sistema è in fase di sviluppo. Riflessione ci offre una soluzione più elegante.
Il nostro sistema è composto da quattro fasi:
- Elencare le classi disponibili
- Una volta selezionata una classe, elencare i suoi metodi pubblici.
- Quando si sceglie un metodo, elencare i suoi parametri in una forma.
- Eseguire il metodo e restituire il risultato per l'utente.
1) Elenco delle classi
Questo passaggio è semplice e ovvio, nel mio caso è sufficiente impostare i file nella cartella dove tengo tutti i tipi, non c'è trucco. Sarebbe solo montare una combinata in un modulo per l'utente di scegliere la classe di provare.
- false !== ( $entry = $d -> read ( ) ) ) { while (falso! == ($ entry = $ d -> read ())) {
- / Files / classe sono il tipo class.nombreClase.php
- $ext == 'php' ) { if ($ ext == 'php') {
- }
- }
- ( array ( "Escoge Clase" ) , $clases ) ; $ Classes = array_merge ( matrice ("Scegli Class"), $ classi);
2) Ottenere un metodi di classe
Ora facciamo uso della classe ReflectionClass per i metodi pubblici di una classe. Ci sono molti altri metodi di questa classe di vedere molte cose.
- isset ( $_GET [ 'clase' ] ) && file_exists ( "class." . $_GET [ 'clase' ] . ".php" ) ) { if ( isset ($ _GET ['classe']) && file_exists ("classe.". $ _GET ['classe']. ". php")) {
- "clases/class." . $_GET [ 'clase' ] . ".php" ) ; require_once ("Corsi / classe". $ _GET ['classe']. ". php.");
- ReflectionClass ( $_GET [ 'clase' ] ) ; $ Classe = new ReflectionClass ($ _GET ['classe']);
- -> getMethods ( ) ; Metodi $ = $ classe -> GetMethods ();
- $metodos as $m ) foreach ($ metodi come $ m)
- = $m -> name ; Metodi di $ [] = $ m -> nome;
- ( array ( "Escoge Método" ) , $methods ) ; Metodi $ = array_merge ( matrice ("Select Method"), $ metodo);
- }
Come si può vedere, si ottiene un altro array con i metodi pubblici della classe selezionata, pronto a montare un altro combo con i metodi disponibili.
3) Ottenere i parametri di un metodo
Conoscendo ora il metodo e la classe che si desidera eseguire abbiamo solo per capire i loro parametri di chiamata. Sembra impossibile, ma ancora una volta l'API Reflection viene in aiuto.
- ReflectionClass ( $_GET [ 'clase' ] ) ; $ Classe = new ReflectionClass ($ _GET ['classe']);
- try {
- -> getMethod ( $method ) ; $ Asmth = $ classe -> getMethod ($ metodo);
- $asmth -> getParameters ( ) as $i => $param ) foreach ($ asmth -> getParameters () da $ i => $ param)
- = $param -> getName ( ) ; $ Parametri [] = $ param -> getName ();
- ReflectionException $e ) { } } Catch (ReflectionException $ e) {}
- }
Abbiamo ancora un'altra matrice dei parametri del metodo. Abbiamo solo bisogno di montare un modulo con molti campi di testo come parametri del metodo per l'utente di provare.
4) Eseguire il metodo
Io complicare ulteriormente le cose. Tutte le mie classi hanno implementato un singleton , che non può essere istanziato come
. Avrebbe potuto fare qualcosa di simile:
- [ 'clase' ] :: getInstancia ( ) ; $ Classe = $ _GET ['classe'] :: getInstancia ();
Ma PHP non è possibile utilizzare una variabile nel nome della classe quando si chiama un metodo statico, restituisce un errore :
Errore di analisi: errore di sintassi, T_PAAMAYIM_NEKUDOTAYIM inaspettato
Che cosa ha portato da hebrero
significare "Unexpected due punti doppio", cioè, nel colon.
Se avessimo il singleton e non necessario per la chiamata statica che restituisce l'istanza, si potrebbe fare qualcosa di simile:
- $_GET [ 'clase' ] ; $ Classe = new $ _GET ['classe'];
- -> metodo ( $parametros ) ; $ Res = $ classe -> metodo ($ parametri);
Ma ci sarebbe ancora un problema con i parametri che non sappiamo quanti ce ne sono da fare, possiamo impostare qualcosa di dinamico in una chiamata diretta a un metodo.
La prima cosa da fare è chiamare getInstancia della mia classe così torniamo un'istanza ad essa. Per questo ci rivolgiamo alla funzione call_user_func che indica la classe e il metodo da eseguire.
- ( array ( $_GET [ 'clase' ] , 'getInstancia' ) ) ; $ Classe = call_user_func ( matrice ($ _GET ['classe'], 'getInstancia'));
Ora eseguire il metodo corrispondente della classe istanziata e passando i parametri necessari in un array, in modo che non importa quanto di li avete, saranno tutti in una lista. Per fare questo usiamo questo tempo call_user_func_array .
- $_GET as $name => $param ) { foreach ($ _GET da $ name => $ param) {
- $name != "clase" && $name != "method" && $name != "submit" ) if ($ nome! = && "classe" $ nome = "metodo" && $ name = "submit"!)
- = $param ; $ Params [] = $ param;
- }
- ( array ( $class , $method ) , $params ) ; $ Res = call_user_func_array ( matrice ($ classe, $ metodo), $ params);
Tutto qui. Siamo riusciti a trovare i metodi di una classe, i suoi parametri ed eseguire il salvataggio di tutti i problemi che abbiamo incontrato.
Spero che si potrebbe aiutare
.



















