quinta-feira, 5 de julho de 2012

Reflection no PHP

Olá amigos e amigas tudo bem? Espero que sim =) ... Hoje vou falar rapidamente do Reflection no PHP... Reflection? 



O que é isso? A partir do PHP 5 foi implementado uma API chamada Reflection. Ela permite fazermos reflexão de objetos, ou seja, observar a estrutura de classes como seus métodos, atributos, interfaces... tudo em tempo de execução (runtime). Basicamente a reflexão de um objeto permite que ele se observe, como nós olhando em um espelho.

Ta, mais e como posso fazer um teste disso? Simples, vamos utilizar a ReflectionClass afim de exibir sua funcionalidade.




  1. <?php
  2. class Pessoa{
  3.    
  4.     private $nome;
  5.     private $sexo;
  6.    
  7.     public function getNome() {
  8.         return $this->nome;
  9.     }
  10.     public function setNome($nome) {
  11.         $this->nome = $nome;
  12.     }
  13.     public function getSexo() {
  14.         return $this->sexo;
  15.     }
  16.     public function setSexo($sexo) {
  17.         $this->sexo = $sexo;
  18.     }
  19.    
  20. }
  21. $reflection = new ReflectionClass('Pessoa');
  22. var_dump($reflection->getMethods());

Veja que criamos uma classe pessoa com 2 atributos, nome e sexo e os sets e gets dessa classe... depois criamos uma instancia da ReflectionClass passando a classe Pessoa como argumento e utilizamos o metodo getMethods para buscar os mesmos... o resultado disso?



  1. array(4) { [0]=> &object(ReflectionMethod)#2 (2) { ["name"]=> string(7) "getNome" ["class"]=> string(6) "Pessoa" } [1]=> &object(ReflectionMethod)#3 (2) { ["name"]=> string(7) "setNome" ["class"]=> string(6) "Pessoa" } [2]=> &object(ReflectionMethod)#4 (2) { ["name"]=> string(7) "getSexo" ["class"]=> string(6) "Pessoa" } [3]=> &object(ReflectionMethod)#5 (2) { ["name"]=> string(7) "setSexo" ["class"]=> string(6) "Pessoa" } }

Esse foi o resultado, conseguimos "dissecar" a classe facilmente... bom não é? Eu tenho certeza que se é a primeira vez que vc lê sobre reflection vc esta com mt raiva... Mais vou amenizar isso sem te oferecer um suco de maracuja.

Onde utilizamos o reflection?
As opções são várias para utilizar o REFLECTION mais eu vou me conter apenas a falar sobre onde já é bem utilizado...

Vc já ouviu falar sobre ORM? Se sim então provavelmente conhece o DOCTRINE framework ORM para PHP não é? Veja bem, o DOCTRINE utiliza reflection nas entidades que escrevemos para poder gerar o SQL e criar/sincronizar nossas classes com o banco, assim não precisamos ficar criando scripts SQL sempre que mudarmos a estrutura do nosso banco basta sincronizar e quem faz essa brincadeira é o DOCTRINE utilizando o REFLECTION do PHP...

O BOUML um software para UML faz uma engenharia reversa do nosso código PHP para diagramas e como vc acha que ele faz isso? Mágica? Não, ele usa o reflection... São 'n' as possibilidades para o uso do reflection então se pintar uma ideia insana para uma aplicação sua e vc achar que ela é impossível pela limitação da tecnologia.... pare, pense, pesquise e implemente! :)

Espero ter ajudado!


=]


Um comentário:

  1. Cara eu nem imaginava que reflection era tão usado por tras dos panos, legal o artigo esta de parabéns mais uma vez!

    ResponderExcluir