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:
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:
-
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!"); } } }
-
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() ); } }
Comentários
Postar um comentário