0

API de Reflexão no PHP5

criado por Rodrigo Rodrigues em 15/08/2005 11:48pm
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: {$exception->getMessage()}.";
}
?>

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: {$exception->getMessage()}.";
}
?>

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: {$reflectionMethod->getName()}<br>";
    echo "Tem os comentários: {$reflectionMethod->getDocComment()}<br>";
    echo "Tem a quantidade de parametros: {$reflectionMethod->getNumberOfParameters()}<br>";
    echo "Ele começa na linha: {$reflectionMethod->getStartLine()} e termina na linha: {$reflectionMethod->getEndLine()}<br>";
    echo "Ele é um método privado: ".($reflectionMethod->isPrivate() ? "Sim" : "Não")."";
} catch(Exception $exception) {
    echo "Aconteceu algum erro: {$exception->getMessage()}.";
}
?>

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: {$reflectionFunction->getName()}<br>";
    echo "Tem os comentários: {$reflectionFunction->getDocComment()}<br>";
    echo "Tem a quantidade de parametros: {$reflectionFunction->getNumberOfParameters()}<br>";
    echo "Ela começa na linha: {$reflectionFunction->getStartLine()} e termina na linha: {$reflectionFunction->getEndLine()}.<br>";
} catch(Exception $exception) {
    echo "Aconteceu algum erro: {$exception->getMessage()}.";
}
?>

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.

Comentários:

Mostrando 1 - 2 de 2 comentários
hinom disse:
hj mesmo eu estava pensando em algo parecido

legal, muito obrigado pelo artigo
vai ajudar muito

17/08/2005 7:32am (~19 anos atrás)

Excelente para quem quiser "documentar" sua aplicação de maneira personalizada.
Claro que para criar docs é mais fácil usar o phpDocumentor, mas com essa Api é possível construir ferramentas personalizadas.

Fazia tempo que não tinhamos artigos novos, parabéns por mais este Rodrigo - Corinthiano Sofredor!!

André Micocci - amenezes@gelre.com.br
16/08/2005 10:33am (~19 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)