terça-feira, 26 de fevereiro de 2013

PHP : Extendendo sua classe com multiplas classes ao mesmo tempo

Quem desenvolvem em PHP, principalmente utilizando orientação a objetos, uma hora tem a nescessidade de usar mais de uma classe ao mesmo tempo junto com uma classe específica.
Para tornar o problema claro, se tivermos uma classe 'A' e precisarmos dos objetos de duas classes independentes 'B' e 'C', o modo mais claro de fazer isso é

Problema acontece quando não podemos extender a classe B com C, seja porque ela já extende uma class D , seja porque ela é usada por outras classes que ja possuem métodos iguais aos de C , etc.
Enfim, uma mão na roda seria simplesmente mantermos as classes "puras" e independentes e extende-las com a classe que quisermos.
A solução para isso é a seguinte:
  1. Crie uma classe abstrata com o seguinte conteudo:
    Abstract class ExtensionBridge {
     
        private $_exts = array();
        
        public function addExt($object){
            $this->_exts[]=$object;
        }
        
        public function __get($varname){
         
            foreach($this->_exts as $ext){
                if(property_exists($ext,$varname))
                return $ext->$varname;
            }
      
        }
        
        public function __call($method,$args){
         
            foreach($this->_exts as $ext){
                if(method_exists($ext,$method))
                return call_user_method_array($method,$ext,$args);
            }
            
            throw new Exception("Este Metodo {$method} nao existe!");
        
     }
    
        }
    
    }
    
  2. Após isso, em nossa classe A , extendemos as classes B e C assim:
    class A extends ExtensionBridge {
    
        public function __construct(){
    
            parent::addExt( new B() );
     parent::addExt( new C() );
    
        }
    
    }
    
E pronto, você pode utilizar todos os métodos das classes B e C na classe A. Se tiver mais classes a serem adicionadas, basta ir acrescentando com o 'addExt'.

Referência

Blog do Fabio Souto Carlos Coelho : Extend de múltiplas classes em PHP - Multiple Inheritance

Nenhum comentário:

Postar um comentário