|
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:
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:
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:
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->a = 1;
$this->b = 54;
$this->c = 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:
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
|
|
|