Nunca havia precisado adicionar um método a algum objeto que eu estivesse manipulando, mas essa semana tive que mesclar a um objeto existente um novo método, que só teria aquele método em certo contexto.

Eu poderia fazer tudo isso na classe que eu estava querendo adicionar esse método, mas o problema era que eu só poderia mexer em outra classe que manipulava essa já existente. Então criei um código que adicionava métodos dinamicamente a essa classe.

  1. <?php
  2. function addMethod($pobj, $psMethodName, $psCode) {
  3.     $sClassName = get_class($pobj)."_".md5(time());
  4.  
  5.     $sEval =
  6.     if(!class_exists(‘.$sClassName.‘)) {
  7.         class ‘.$sClassName.‘ extends ‘.get_class($pobj).‘ {
  8.        
  9.             function __construct() {
  10.                 parent::__construct();
  11.             }
  12.        
  13.             function ‘.$psMethodName.‘() {
  14.                 ‘.$psCode.
  15.             }
  16.         }
  17.     }
  18.     ‘;
  19.  
  20.     eval($sEval);
  21.  
  22.     return new $sClassName();
  23. }
  24.  
  25. $obj = new Classe();
  26. $obj = addMethod($obj,"metodoNovo","echo ‘Método novo’;");
  27.  
  28. $obj->metodoNovo(); // O resultado será: Método novo
  29. ?>

O código para adicionar o novo método é bastante simples, vou explicá-lo rapidamente.

Na linha 3 eu crio um nome único para a nova classe. Na linha 6 eu verifico se essa classe já existe.

Na linha 7 eu defino a classe e estendo a classe do objeto que eu quero adicionar o novo método.

No construtor da nova classe eu chamo o construtor da classe do objeto que terá o método adicionado para que ele possa ser refeito, por isso que o addMethod sempre deve ser chamado logo após o objeto ser criado, para que ele não perca nenhuma informação.

Na linha 20 é dado um eval na string do código da classe e em seguida é retornado o objeto da nova classe com todas as funcionalidades do objeto passado por parâmetro e mais o novo método.

Na linha 26 é dado um exemplo de como chamar a função addMethod e quais os seus parâmetros. O primeiro é o objeto corrente, o segundo é o nome do método e o terceiro parâmetro é o código do novo método.

Uma dica importante é para se em alguma parte do código for preciso usar uma verificação de qual é o objeto, deve-se usar instanceof e não o is_a, porque o objeto se transformará em outro com as funcionalidades que ele já possuia.

O conteúdo te ajudou de alguma forma? Que tal retribuir me pagando um café?

Gostou desse post? Compartilhe:
  • Facebook
  • Rec6
  • Tumblr
  • Posterous
  • del.icio.us
  • Add to favorites
  • LinkedIn
  • Google Bookmarks
  • RSS

Conteúdos relacionados