Pular para o conteúdo principal

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

Comentários

Postagens mais visitadas deste blog

Javascript : Converter sigla de estados em nome de estados

Esse é um switch prático pra quem precisa converter as siglas dos estados brasileiros nos seus respectivos nomes. Dado uma variável 'UF' com a sigla, vamos salvar em 'ESTADO' o nome correspondente: switch(UF){ case 'AC': ESTADO = 'Acre'; break; case 'AL': ESTADO = 'Alagoas'; break; case 'AP': ESTADO = 'Amapá'; break; case 'AM': ESTADO = 'Amazonas'; break; case 'BA': ESTADO = 'Bahia'; break; case 'CE': ESTADO = 'Ceará'; break; case 'DF': ESTADO = 'Distrito Federal'; break; case 'ES': ESTADO = 'Espírito Santo'; break; case 'GO': ESTADO = 'Goiás'; break; case 'MA': ESTADO = 'Maranhão'; break; case 'MT': ESTADO = 'Mato Grosso'; break; case 'MS': ESTADO = 'Mato Grosso do Sul'; break; case 'MG': ESTADO = 'Minas Gerais&

PHP : array de estados brasileiros com nomes e siglas

Esse é um simples array com os nomes dos estados e suas correspondentes siglas. Cada estado é um array numerado e e "bem comportado" : tudo em minúsculas e sem acentos, porque evita problemas de compatibilidade de codificação e você sempre pode usar um "strtoupper", "ucfirst" e "ucwords" do PHP para tratar a formatação. $estados = array( 1=>array("sigla"=>"ac","nome"=>"acre"), 2=>array("sigla"=>"al","nome"=>"alagoas"), 3=>array("sigla"=>"am","nome"=>"amazonas"), 4=>array("sigla"=>"ap","nome"=>"amapa"), 5=>array("sigla"=>"ba","nome"=>"bahia"), 6=>array("sigla"=>"ce","nome"=>"ceara"), 7=>array("sigla"=>"df","nome"=>&q

Criando um repositorio GIT de forma fácil e rápida

Para se criar um servidor central git para salvar seus  projetos e compartilhar com outros desenvolvedores, tenha uma máquina rodando um servidor ssh  e um dominio. Caso a máquina so faça compartilhamento num rede interna, basta ter em mãos o ip dela. Configure os usuários e grupos com permissão de acesso a máquina e tenha certeza que todos conseguem acessar via ssh nela. Como exemplo, aqui o usuário será 'user' e o endereço do host servidor será 'meu.server.br' . Crie uma pasta para ser o repositório dos projetos. Aqui usaremos como exemplo a pasta '/pasta/repo' . Agora, no servidor, você vai criar uma pasta limpa para receber o projeto e executar o comando de inicialização do projeto git remoto, assim: $ cd /pasta/repo $ mkdir meuprojeto.git $ cd meuprojeto.git $ git --bare init IMPORTANTE : a pasta do projeto compartilhado DEVE terminar com ‘.git’ Em sua área de trabalho LOCAL, você irá para a pasta do projeto que quer iniciar no