OOP no PHP: Reaproveitamento, Sobrescrevendo métodos
por Tobias em 17.12.2008 07:09 Desenvolvimento web, Destaques, OOP, php
E ae blz?
Chegamos numa das partes interessantes da nossa série de posts, é onde começo a falar das gambiarras técnicas usadas por nós programadores para salvar horas de trabalho no desenvolvimento.
Para ilustrar o post de hoje vou usar um caso que aconteceu comigo a algum tempo. Na empresa onde trabalho, fizemos um sistema publicador de sites, um CMS próprio desenvolvido aqui, e que um belo dia recebi um pedido para incluir nele uma espécie de lixeira.
Bom para implementar essa feature a solução sugerida foi criar uma coluna em cada tabela com o nome de trash e que teria valor default 0 e quando um item fosse deletado esse valor seria alterado para 1.
Tendo isso em mente comecei a implementação, alterar o banco foi moleza, agora eu precisava implementar essa condição no sistema. Foi quando me deparei com a seguinte situação, teria que alterar cada uma das chamadas do método findAll() em todo o sistema, pensei,… pensei,… e quando já não via mais solução pra isso um amigo sugeriu “pow, sobrescreve findAll() que tu evita esse trabalhão“, e assim foi feito :).
Agora que vocês já sabem o problema vou mostrar a solução que eu usei nessa situação.
Eu tinha em em mãos as classes Model, AppModel e uma classe pra cada um dos models específicos (sim, usamos CakePHP).
A classe Model é a base de toda interação com o banco, é uma classe do core do framework extendida pela classe AppModel.
A AppModel é uma classe feita exatamente para esse fim, ela inicialmente é vazio e só extende a classe Model do framework e é extendida pelos models da aplicação, ou seja, é usada por todos os models do sistema e ainda herda o método que eu preciso sobrescrever, tudo que eu precisava.
O método findAll original dentro da classe Model é tem essa estrutura de parâmetros:
A método sobrescrito na AppModel ficou assim:
findInTrash)
$new_conditions += array($this->name.'.trash' => '0');
return parent::findAll($new_conditions, $fields, $order, $limit, $page, $recursive);
}
...
}
?>
Antes de mais nada vou avisar o óbvio, só coloquei aqui os códigos necessários para explicar o post as classes são bem maiores que isso ;).
Notem também que eu não mudei os parametros usados no método mas poderia faze-lo se fosse necessário, esse método recebe todos os paramêtros possíveis no findAll original, altera as condições necessárias e chama o método findAll da classe pai usando o parent::.
Nesse caso em particular eu só precisava sobrescrever o método para adicionar uma condição específica, mas dependendo do caso talvez você precise que um mesmo método seja chamado de formas diferentes ou com uma quantidade de parâmetros diferentes, o que também poderia ser feito, mas isso já é assunto para um próximo post.
Dúvidas? sugestões? puxões de orelha? comentários tão ai pra isso.
Um abraço e até o próximo post.


18.12.08 17:15 at 05:15
Parabéns, Tobias.
Os artigos estão ficando bem legais. Sem muita complicação, apenas o básico.
Penso que usando uma classe abstract também resolvia o teu problema já que os parâmetros não foram mudados :P
parabéns..
26.01.09 16:59 at 04:59
é sempre tem mais de uma solução para os problemas, mas essa solução funcionou bem e era um ótimo ilustrativo pra explicar o artigo.