Recursos de Reflexão no PHP
por Rogério Bragil

Inspecionar um objeto ou classe é muito interessante para aplicações OOP no PHP, particulamente em persistência de objetos. O PHP expande as opções para esse tipo de programação com as novas versões PHP5, e iremos dar uma rápida descrição sobre essas funções.



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:


<?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.


get_parent_class($objeto)

Retorna o nome da classe pai de $objeto ($objeto neste caso pode ser uma referência de um objeto ou uma string contendo o nome da classe).

Exemplo:


<?php
// classe exemplo
class Pai
{
    function 
hello()
    {
        echo 
"Olá, PHP!";
    }
}

class 
Filha extends Pai
{
    function 
ola()
    {
        echo 
"classe filha";
    }
}

$f = new Filha();
echo 
get_parent_class($f);
?>


Saída:

Pai


is_a($objeto, $classe)

Retorna true se a referência $objeto é uma instância da classe de nome $classe ou se $objeto herdar da classe $classe, e false caso contrário.

Exemplo:


<?php
class Pai
{
    function 
hello()
    {
        echo 
"Olá, PHP!";
    }
}

class 
Filha extends Pai
{
    function 
ola()
    {
        echo 
"classe filha";
    }
}

$f = new Filha();
$p = new Pai();
if (
is_a($p,"Filha")) {
    echo 
"OK";
} else {
    echo 
"Não";
}
?>


A saída nesse caso será "Não", porque o objeto $p não é uma instância da classe Filha e nem herda dessa classe.

is_subclass_of($objeto, $classe)

Retorna true se a referência $objeto for uma subclasse da classe de nome $classe, e false caso contrário.

Exemplo:


<?php
class Pai
{
    function 
hello()
    {
        echo 
"Olá, PHP!";
    }
}

class 
Filha extends Pai
{
    function 
ola()
    {
        echo 
"classe filha";
    }
}

$f = new Filha();
$p = new Pai();
if (
is_subclass_of($f,"Pai")) {
    echo 
"OK";
} else {
    echo 
"Não";
}
?>


Saída:

OK



get_class_vars($nomeclasse)

A função get_class_vars($nomeclasse) retorna um array associativo contendo os nomes dos atributos es os valores de inicialização da classe de nome $nomeclasse. Exemplo:


<?php
class Exemplo
{
    var 
$atrib1// não inicializado
    
var $atrib2 "olá";
    var 
$atrib3 "php";

    function 
hello()
    {
        echo 
"Olá, PHP!";
    }
}

print_r(get_class_vars("Exemplo"));
?>


Saída:

Array
 (
     [atrib1] => 
     [atrib2] => olá
     [atrib3] => php
 )


get_object_vars($objeto)

Semelhante a get_class_vars(), só que recebe uma referência de um objeto e retorna um array associativo com os nomes dos atributos e os seus valores (não apenas os valores de inicialização, como em get_class_vars()).

Exemplo:

<?php
class Exemplo
{
    var 
$a;   
    var 
$b;
    var 
$c;

    function 
atribui()
    {
        
$this->1;
        
$this->54;
        
$this->123;
    }
}

$p = new Exemplo();
$p->atribui();
print_r(get_object_vars($p));
?>


Saída:

Array
 (
     [a] => 1 
     [b] => 54
     [c] => 123
 )


get_class_methods($objeto)

Retorna um array contendo os nomes dos métodos da referência $objeto (o argumento também pode ser o nome da classe).

Exemplo:

<?php
class Exemplo
{
    function 
metodo_a()
    {
        echo 
"A";
    }

    function 
metodo_b()
    {
        echo 
"B";
    }
}

$ex = new Exemplo();
$array get_class_methods($ex);
foreach(
$array as $metodos) {
    echo 
$metodos."<br>";
}
?>


Saída:
 
metodo_a
metodo_b


method_exists($objeto, $nomemetodo)

Retorna true se $objeto possui um método com o nome $nomemetodo e false caso contrário.


Bem, é isso. Espero que tenha trazido um algo mais para o conhecimento da comunidade PHP.

bragil