API de Reflexão no PHP5
por Rodrigo Rodrigues

A partir do PHP5 temos uma ótima API de reflexão, veja aqui seus conceitos básicos e como usá-la.



Usando a reflexão do PHP5 temos um maior controle das classes, interfaces, funções, extensões em tempo de execução e até mesmo dos blocos de comentários.

Vamos para os exemplos:


<?php
class Teste
{
    
private $nome;

    function 
__construct()
    {
        echo 
"hello<br>";
    }

    
public function setNome($nome)
    {
        
$this->nome $nome;
    }

    
public function getNome()
    {
        return 
$this->nome;
    }
}

try {
    echo 
"<pre>";
    
Reflection::export(new ReflectionClass('Teste'));
    echo 
"</pre>";
catch(Exception $exception) {
    echo 
"Aconteceu algum erro: <b>{$exception->getMessage()}</b>.";
}
?>


Usando o "Reflection::export" printará na tela todas as informações da classe "Teste", desde o seu nome, caminho físico até os nomes dos métodos, o número das linhas onde eles se encontram entre outras informações.
A classe "ReflectionClass" é a responsável para obter informações das nossas classes.

Outro exemplo:


<?php
/**
* Autor: Rodrigo Rodrigues
* Descrição: Usando Reflexão no Php5.
* Data: 21/05/2005
*/
class Teste
{
    
private $nome;
    
    function 
__construct() { }

    
public function setNome($nome)
    {
        
$this->nome $nome;
    }

    
public function getNome()
    {
        return 
$this->nome;
    }
    
}

try {
    
$reflectionClass = new ReflectionClass("Teste");
    
$teste $reflectionClass->newInstance();
    
$teste->setNome("Php5 também é a luz.");
    echo 
$teste->getNome()."<br>";
    echo 
$reflectionClass->getDocComment();
catch(Exception $exception) {
    echo 
"Aconteceu algum erro: <b>{$exception->getMessage()}</b>.";
}
?>


Como paramêtro da "ReflectionClass" passamos o nome da nossa classe "Teste" de exemplo.
O método "newInstance" retorna uma instância da classe "Teste".
O "getDocComment" retorna o comentário da classe.

Mais um exemplo:


<?php
/**
* Autor: Rodrigo Rodrigues
* Descrição: Usando Reflexão no Php5.
* Data: 21/05/2005
*/
class Teste
{
    
private $nome;

    function 
__construct() { }

    
/**
    * Método Set para atribuir valor ao nome.
    * @access public
    * @return void;
    * @param String nome;
    */
    
public function setNome($nome)
    {
        
$this->nome $nome;
    }

    
public function getNome()
    {
        return 
$this->nome;
    }
}

try {
    
$reflectionMethod = new ReflectionMethod("Teste""setNome");
    echo 
"O método se chama: <b>{$reflectionMethod->getName()}</b><br>";
    echo 
"Tem os comentários: <b>{$reflectionMethod->getDocComment()}</b><br>";
    echo 
"Tem a quantidade de parametros: <b>{$reflectionMethod->getNumberOfParameters()}</b><br>";
    echo 
"Ele começa na linha: <b>{$reflectionMethod->getStartLine()}</b> e termina na linha: <b>{$reflectionMethod->getEndLine()}</b><br>";
    echo 
"Ele é um método privado: <b>".($reflectionMethod->isPrivate() ? "Sim" "Não")."</b>";
catch(Exception $exception) {
    echo 
"Aconteceu algum erro: <b>{$exception->getMessage()}</b>.";
}
?>


A classe "ReflectionMethod" serve para obter informações dos métodos das classes, passamos como parâmetros o nome da classe e o método.
O método "getName" retorna o nome do método.
O "getDocComment" retorna o comentário do método.
O "getNumberOfParameters" retorna o número de parâmetros que tem no método.
O "getStartLine" fala o número da linha onde começa e o "getEndLine" onde termina.
O último "isPrivate" retorna um boolean para saber se o método é privado.

O nosso último exemplo:


<?php
/**
* Função para somar 2 números
* @param int a
* @param int b
* @return int
*/
function soma($a$b)
{
    return (
$a b);
}

try {
    
$reflectionFunction = new ReflectionFunction("soma");
    echo 
"A função se chama: <b>{$reflectionFunction->getName()}</b><br>";
    echo 
"Tem os comentários: <b>{$reflectionFunction->getDocComment()}</b><br>";
    echo 
"Tem a quantidade de parametros: <b>{$reflectionFunction->getNumberOfParameters()}</b><br>";
    echo 
"Ela começa na linha: <b>{$reflectionFunction->getStartLine()}</b> e termina na linha: <b>{$reflectionFunction->getEndLine()}</b>.<br>";
catch(Exception $exception) {
    echo 
"Aconteceu algum erro: <b>{$exception->getMessage()}</b>.";
}
?>


Só acrescentado que a classe "ReflectionFunction" serve para obter informações das funções, como parâmetro passamos o nome da função.

Bom é isso espero que tenham gostado, lembrando que existem outras classes de reflexão(como a ReflectionParameter, ReflectionProperty, ReflectionExtension).

Para maiores detalhes acessem o manual oficial: http://br2.php.net/manual/pt_BR/language.oop5.reflection.php

Sem mais, Rodrigo.