Literalmente, o Reflection paradigma é um processo pelo qual o software pode-se observar a si mesmo, aprender sobre como é desenvolvido e modificado automaticamente. Isso está claro?. Já
.
Suponha que você tenha uma classe com alguns atributos e métodos. Agora, suponha que de outra classe, por qualquer motivo você precisa descobrir quais atributos e métodos é que a primeira classe. Além disso, suponha que você precisa saber os parâmetros de cada chamada de método. Você não pode!. Bem, você está errado
, Sim, pode, a reflexão paradigma é o que nos dá a solução e vem implementado em PHP com as classes definidas para dar-lhe tudo feito. Uma espécie de engenharia reversa.
Estar pensando o que é bom isso? Por que eu preciso disso?. Bem, isso depende do que você quer fazer
. Provavelmente, se você sabe que existe e que você pode fazer, um dia resort para ele. No meu caso eu precisava para criar um sistema dinâmico para listar qualquer número de classes, métodos e executá-los com todos os seus parâmetros, ou seja, listar todos os parâmetros de um método de uma forma que os usuários podem preencher e executar esse método a classe para obter o resultado. Poderia fazer o carregamento em um banco de dados de todas as classes, métodos e atributos destes, mas exigiria uma manutenção terrível e ter em conta, além disso, cada vez que você mudar alguma coisa, porque o sistema está em desenvolvimento. Reflexo nos dá uma solução mais elegante.
O sistema consiste de quatro etapas:
- Liste as classes disponíveis
- Uma vez que uma classe é selecionada, a lista de seus métodos públicos.
- Ao escolher um método, listar seus parâmetros de forma.
- Executar o método e retornar o resultado para o usuário.
1) Lista de aulas
Este passo é simples e óbvia, no meu caso apenas definir os arquivos na pasta onde guardo todos os tipos, não há nenhum truque. Só iria montar uma combinação em um formulário para o usuário escolher a classe de tentar.
- false !== ( $entry = $d -> read ( ) ) ) { while (false! == ($ entrada = $ d -> read ())) {
- / / Arquivos de classe são o tipo class.nombreClase.php
- $ext == 'php' ) { if ($ ext == 'php') {
- }
- }
- ( array ( "Escoge Clase" ) , $clases ) ; $ Classes = array_merge ( série ("Escolha Class"), $ classes);
2) a obtenção de um dos métodos da classe
Vamos agora fazer uso da classe ReflectionClass para métodos públicos de uma classe. Há muitos mais métodos dessa classe para ver muitas coisas.
- isset ( $_GET [ 'clase' ] ) && file_exists ( "class." . $_GET [ 'clase' ] . ".php" ) ) { if ( isset ($ _GET ['class']) && file_exists ("classe".. $ _GET ['class']. ". php")) {
- "clases/class." . $_GET [ 'clase' ] . ".php" ) ; require_once ("classes / aula." $ _GET ['classe']. ". php.");
- ReflectionClass ( $_GET [ 'clase' ] ) ; $ Class = new ReflectionClass ($ _GET ['class']);
- -> getMethods ( ) ; Métodos = $ $ classe -> getMethods ();
- $metodos as $m ) foreach ($ métodos como $ m)
- = $m -> name ; $ Methods [] = $ m -> nome;
- ( array ( "Escoge Método" ) , $methods ) ; $ Métodos = array_merge ( série ("Select Method"), $ métodos);
- }
Como você pode ver, temos um outro array com os métodos públicos da classe selecionada, pronto para montar uma outra combinação com os métodos disponíveis.
3) Obtenção dos parâmetros de um método
Sabendo agora o método ea classe que você deseja executar só temos de descobrir os seus parâmetros de invocação. Parece impossível, mas novamente a API Reflection vem em nosso auxílio.
- ReflectionClass ( $_GET [ 'clase' ] ) ; $ Class = new ReflectionClass ($ _GET ['class']);
- try {
- -> getMethod ( $method ) ; $ Asmth = $ class -> getMethod ($ method);
- $asmth -> getParameters ( ) as $i => $param ) foreach ($ asmth -> getParameters () as $ i => $ param)
- = $param -> getName ( ) ; $ Parâmetros [] = $ param -> getName ();
- ReflectionException $e ) { } } Catch (ReflectionException $ e) {}
- }
Temos ainda um outro conjunto de parâmetros do método. Nós só precisamos montar um formulário com muitos campos de texto como parâmetros do método para o usuário tentar.
4) Executar o método
Vou complicar ainda mais as coisas. Todas as minhas aulas têm implementado um singleton , o que não pode ser instanciado como
. Poderia ter feito algo como:
- [ 'clase' ] :: getInstancia ( ) ; $ Class = $ _GET ['class'] :: getInstancia ();
Mas o PHP não pode usar uma variável no nome da classe ao chamar um método estático, retornar um erro :
Erro de análise: erro de sintaxe, inesperado T_PAAMAYIM_NEKUDOTAYIM
O que resultou Hebrero
significa "Unexpected double-colon", ou seja, no cólon.
Se tivéssemos o singleton e não é necessário para a chamada estático que retorna a instância, poderíamos fazer algo como:
- $_GET [ 'clase' ] ; $ Class = new $ _GET ['class'];
- -> metodo ( $parametros ) ; $ Res = $ class -> método ($ parameters);
Mas nós ainda temos um problema com os parâmetros que nós não sabemos quantos existem para ir, podemos definir algo dinâmico em uma chamada direta para um método.
A primeira coisa a fazer é chamar getInstancia da minha classe para que retorne um exemplo para ele. Por isso nos voltamos para a função call_user_func indicando a classe eo método para executar.
- ( array ( $_GET [ 'clase' ] , 'getInstancia' ) ) ; $ Class = call_user_func ( série ($ _GET ['class'], 'getInstancia'));
Agora, execute o método correspondente na classe instanciado e passando os parâmetros necessários em uma matriz, de modo que não importa o quanto deles você tem, tudo vai em uma lista. Para fazer isso, use esse tempo call_user_func_array .
- $_GET as $name => $param ) { foreach ($ _GET como $ name => $ param) {
- $name != "clase" && $name != "method" && $name != "submit" ) if ($ name! = "classe" && $ nome! = "método" && $ name! = "submit")
- = $param ; $ Params [] = $ param;
- }
- ( array ( $class , $method ) , $params ) ; $ Res = call_user_func_array ( série ($ class, $ method), $ params);
É isso aí. Conseguimos encontrar os métodos de uma classe, seus parâmetros e executar salvar todos os problemas que encontramos.
Espero que possa ajudar
.



















