sexta-feira, 4 de novembro de 2011

Polimorfismo e Herança no PHP

Olá meus amigos e amigas tudo bem? Hoje vou falar de um assunto atípico dos meus posts... hoje vou falar sobre Polimorfismo e Herança no PHP. E se você acha que não existe isso no php tome cuidado com o que fala, o php vem evoluindo muito!

Uma classe é uma estrutura básica para a criação de objetos ou seja, vários objetos podem ser criados seguindo a mesma estrutura, porém com dados diferentes. 
Em algumas casos é necessários ter objetos idênticos com algumas funcionalidades a mais ou então com as mesmas funcionalidades, mas com comportamentos diferentes...

Herança

O que será esse carinha? Herança faz parte de um dos 3 pilares da POO uma herança é a
forma de um filho obter características do pai na vida real concorda? Na POO também é assim...

Por exemplo um carro e uma moto possuem características bem parecidas. Ambos possuem rodas e marchas que são semelhantes em qualquer veículo.
Pensando assim podemos dizer que carro é um veículo, assim como uma moto também é um veículo concordam? Logo carro e moto herdam características de veículo.

Esse exemplo é muito simples no php, e para herdar de uma classe utilizamos o 'extends' veja:



  1. <?php
  2. class Veiculo
  3. {
  4.         private $marcha;
  5.         private $quantidadeRodas;
  6.         public function passarMarcha()
  7.         {
  8.                 // código
  9.         }
  10.         public function andar()
  11.         {
  12.                 // código
  13.         }
  14. }
  15. class Carro extends Veiculo
  16. {
  17.         public function __construct()
  18.         {
  19.                 $this->quantidadeRodas = 4;
  20.         }
  21. }
  22. $carro = new Carro();
  23. $carro->andar();



Veja só, criamos a classe veículo com atributos marcha e quantidadedeRodas e criamos uma classe carro que extende da veículo já com o construtor montando a quantidade de rodas. simples não? Herança SUALINDA :D


Polimorfismo

Poli o que? Oo'
POLIMORFISMO! Mas o que é isso? Vamos primeiro entender a palavra, polimorfismo significa muitas formas (poli: muitas, morphos: formas). Esse conceito é perfeito pois na POO significa que várias classes podem possuir a mesma estrutura e comportamentos diferentes. Quando utilizamos herança não apenas podemos reutilizar métodos da classe pai, como também podemos sobreescrever os métodos da classe pai, fazendo assim com que certas características sejam modificadas para a determinada classe.

Vamos imaginar que um banco possui dois tipos de cheques; o chque comum e o especial. Os dois possuem a mesma estrutura o que diferencia um do outro é a forma de cobrança de juros. O comum cobra 25% em cima do valor e o cheque especial o valor dos juros de 10% como podemos fazer sem escrever a mesma coisa? Assim:



  1. <?php
  2. class ChequeComum
  3. {
  4.     protected $valor;
  5.         // ... outros métodos da classe
  6.         public function setValor( $valor )
  7.         {
  8.                 $this->valor = $valor;
  9.         }
  10.         public function getValor()
  11.         {
  12.                 return $this->valor;
  13.         }
  14.         public function calculaJuros()
  15.         {
  16.                 return $this->valor * 1.25; // soma 25% em cima do valor
  17.         }
  18. }
  19. class ChequeEspecial extends ChequeComum
  20. {
  21.         public function calculaJuros()
  22.         {
  23.                 return $this->valor * 1.10; // soma 10% em cima do valor
  24.         }
  25.        
  26.         public function calculaJurosPai(){
  27.                 return $this->valor = parent::calculaJuros();
  28.         }
  29. }
  30. $cheque = new ChequeEspecial();
  31. $cheque->setValor(1000);
  32. //CHAMANDO DA PRÓPRIA CLASSE
  33. echo $cheque->calculaJuros();
  34. echo "<hr>";
  35. //CHAMANDO DA CLASSE PAI
  36. echo $cheque->calculaJurosPai();
Antes de mais nada veja que na classe ChequeComum criei o atributo $valor com o acesso 'protect' ou seja, disse que ele é protegido assim pode ser acessado pela própria classe e classes que 'ligam' ela.

Perceba que na classe ChequeEspecial eu criei um método chamado calculaJurosPai ele foi apena para mostrar que se existir a necessidade do uso de um método sobrescrito devemos acessar ele paralelamente dessa forma (parent::).
Como exemplo eu criei o objeto e exibi os dois calcula juros...

Legal não é? Agora utilize =]

Obrigado e até a próxima

3 comentários:

  1. Bom artigo Paulo. Me indica algum livro sobre POO com PHP?

    ResponderExcluir
  2. Oi PV acompanho seu blog a uns meses e cada vez que apareço aqui vejo um post altamente complexo e completo... estou estudando programação com php e vc é muito melhor que os professores da tecnopontaa vio??? ta dando aula em santos?

    ResponderExcluir
  3. SHOW CARA MAS TEM UNS POSTS MAIS SIMPLES SOBRE PHP? SOU OBRIGADO A PROGRAMAR ORIENTADO A OBJETOS?

    ResponderExcluir