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 (~20 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 (~20 anos atrás)

Novo Comentário:

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