OOP no PHP: Reaproveitamento, Sobrescrevendo métodos

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.

2 Respostas to “OOP no PHP: Reaproveitamento, Sobrescrevendo métodos”

  1. Trambulhao falou:

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


  2. Tobias falou:

    é 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.


Deixe seu comentário

XHTML: Você pode usar essas tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

Notificar-me se houver novos comentários