Recursos de Reflexão no PHP
Podemos definir reflexão como a capacidade de obter informações de classes e objetos em tempo de execução. Por exemplo, você pode obter a lista dos nomes dos atributos de um objeto e seus valores, obter o nome dos métodos de um objeto, verificar se uma determinada
classe foi definida, verificar se um objeto é filho de determinada classe, entre outros.
Em determinadas situações, usar reflexão é o único meio de resolver o problema. Podemos dar como exemplo a persistência de objetos. Através de reflexão, você obtém os nomes e valores dos atributos do objeto, para poder persistir da forma como quiser. Quando o
objeto for carregado novamente, basta pegar esses nomes e valores que estão gravados e atribuir ao objeto recém carregado. Esse é apenas um exemplo da utilidade do recurso de reflexão.
A linguagem PHP possui algumas funções para este fim, não com tantos recursos como a API de reflexão de Java, mas já quebra um galho em determinadas situações.
get_class($objeto)
A função get_class() retorna uma string contendo o nome da classe do objeto passado como parâmetro:
Saída:
class_exists($nomedaclasse)
Retorna true se a classe de nome $nomedaclasse existir e false caso contrário.
interface_exists($nomedainterface) (PHP5)
Retorna true se a interface de nome $nomedainterface existir e false caso contrário.
get_declared_classes()
Retorna um array com os nomes das classes já definidas no script em execução(inclusive as classes pré-definidas de PHP)
get_declared_interfaces() (PHP5)
Retorna um array com os nomes das interfaces já definidas no script em execução.
classe foi definida, verificar se um objeto é filho de determinada classe, entre outros.
Em determinadas situações, usar reflexão é o único meio de resolver o problema. Podemos dar como exemplo a persistência de objetos. Através de reflexão, você obtém os nomes e valores dos atributos do objeto, para poder persistir da forma como quiser. Quando o
objeto for carregado novamente, basta pegar esses nomes e valores que estão gravados e atribuir ao objeto recém carregado. Esse é apenas um exemplo da utilidade do recurso de reflexão.
A linguagem PHP possui algumas funções para este fim, não com tantos recursos como a API de reflexão de Java, mas já quebra um galho em determinadas situações.
get_class($objeto)
A função get_class() retorna uma string contendo o nome da classe do objeto passado como parâmetro:
<?php // classe exemplo class Exemplo { function hello() { echo "Olá, PHP!"; } } // instanciando $ex = new Exemplo(); $nomeclasse = get_class($ex); echo $nomeclasse; ?>
Saída:
Exemplo
class_exists($nomedaclasse)
Retorna true se a classe de nome $nomedaclasse existir e false caso contrário.
interface_exists($nomedainterface) (PHP5)
Retorna true se a interface de nome $nomedainterface existir e false caso contrário.
get_declared_classes()
Retorna um array com os nomes das classes já definidas no script em execução(inclusive as classes pré-definidas de PHP)
get_declared_interfaces() (PHP5)
Retorna um array com os nomes das interfaces já definidas no script em execução.
Eu tenho uma classe aonde eu necessito gerar um comando SQL dinamicamente. Então eu usei a classe ReflectionClass da API de Reflexão para pegar todos os atributos da minha classe e assim poder gerar um comando SQL dinamicamente.
Mas tenho dúvidas em relação à velocidade. Isso não tornaria o script mais lento??
O meu codigo seria basicamente isso:
echo "<PRE>";
$reflection = new ReflectionClass(__CLASS__);
$defaults = $reflection->getdefaultProperties();
print_r($defaults);
echo "</PRE>";
Mas tenho dúvidas em relação à velocidade. Isso não tornaria o script mais lento??
O meu codigo seria basicamente isso:
echo "<PRE>";
$reflection = new ReflectionClass(__CLASS__);
$defaults = $reflection->getdefaultProperties();
print_r($defaults);
echo "</PRE>";
09/07/2005 10:11pm
(~19 anos atrás)
Ah, sim, para reflexão ao pé da letra faltam muitos recursos... Mas quero dar uma olhada nessa API aí prá ver como que é...
Valeu!
Valeu!
20/05/2005 4:57pm
(~19 anos atrás)
Hehehe, nem sabia...
Passa o link do site aí prá gente ver...
Valeu!
bragil
Passa o link do site aí prá gente ver...
Valeu!
bragil
20/05/2005 4:55pm
(~19 anos atrás)
Parabéns pelo artigo mas apartir do Php 5 já existe uma ótima API para reflexão, tão boa(se bobear até melhor) quanto ao que existe para o Java.
Esses comandos que vc usou auxiliam para ter mais detalhes das classes(objetos), reflexão mesmo só apartir no Php5, para maiores detalhes acesse "http://br2.php.net/manual/pt_BR/language.oop5.reflection.php".
Esses comandos que vc usou auxiliam para ter mais detalhes das classes(objetos), reflexão mesmo só apartir no Php5, para maiores detalhes acesse "http://br2.php.net/manual/pt_BR/language.oop5.reflection.php".
20/05/2005 1:05pm
(~19 anos atrás)
Eu criei uma classe DAO, que recebe um objeto e monta as queries de insert, update e delete.
Acho que não interfere na performance não, eu fiz alguns testes e não notei nada de errado.