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

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"=>...

Instalando o Skype 4.1 no Debian 6 Squeeze

Como todo mundo sabe, a Micro$oft comprou a Skype e vai migrar o msn para esse serviço. Por um lado é bom, porque o skype já possue um suporte aceitável no linux - inclusive o compartilhamento de cam, que tinha sido bloqueado pela M$ em outros sistemas que não fosse Windows e MSN. Segue aqui a receita para instalar a mais nova versão com suporte a msn e facebook para Debian 6  Squeeze. No meu caso é 64bits, mas deve funcionar melhor ainda em sistemas de 32 bits. Toda a operação deve ser realizada como root .  Baixe a versão Dynamic do Skype para Linux ( http://www.skype.com/intl/pt-br/get-skype/on-your-computer/linux/downloading.dynamic ). Descompacte a pasta do Skype que você baixou em '/opt'. Eu renomeei a pasta para 'skype', porque acho mais fácil de trabalhar. Instale os seguintes pacotes: $ aptitude install lib32asound2 ia32-libs ia32-libs-gtk Agora, baixe os seguintes arquivos: $ wget http://ftp.us.debian.org/debian/pool/main/q/qt4-x11/libqt4-...

Javascript : Simples Video Player usando Youtube API

Para quem não sabe, a Google disponibiliza para desenvolvedores uma APi de manipulação para vídeos do Youtube, onde você pode ter uma grande quantidade de opções de controle. Baseado nessa API, vou disponibilizar aqui um simples player que aceita opções. Crie um script de nome 'youtube.js' e coloque o seguinte conteudo // youtube.js // Aqui é incluido a API em javascript para Youtube. var tag = document.createElement('script'); tag.src = "https://www.youtube.com/iframe_api"; var firstScriptTag = document.getElementsByTagName('script')[0]; firstScriptTag.parentNode.insertBefore(tag,firstScriptTag); // Aqui é a função que carrega o vídeo. // 'vid' é o id do video do youtube. // 'playerid' é o id da tag html que vai rodar o vídeo. function loadVideo(vid,playerid){ var player = new YT.Player(playerid, { // O id do player é colocado, passado pelo parâmetro da função. height: '390', width: '640', ...