Pesquisar neste blog

sexta-feira, 29 de junho de 2012

O que é Polimorfismo em PHP?


Polimorfismo (“…Existência de uma espécie sob várias formas…”) é um artefato simples mas seu entendimento é muito importante na orientação a objetos. Quando falamos em polimorfismo em OO, queremos dizer que podemos derivar classes de uma mesma superclasse e utilizar métodos iguais, porém com comportamentos diferentes. Veja o exemplo:
Arquivo Calculo1.php
1
2
3
4
5
6
7
8
class Calculo1{
    public $resposta;
 
    public function dividir(){
        return $this->resposta = 10/2;
    }
 
}
Arquivo Calculo2.php
1
2
3
4
5
6
7
8
9
10
require_once "Calculo1.php";
 
class Calculo2 extends Calculo1{
    public $resposta;
 
    public function somar(){
        return $this->resposta = 1+1;
    }
 
}
Repare que temos 2 arquivos diferentes onde em Calculo2.php nossa classe Calculo2 está herdando as características da classe Calculo1 (saiba mais sobre herança clicando aqui). Feito isso eu posso receber as resposta de Calculo1 (dividindo) e Calculo2 (somando) criando apenas o objeto da classe Calculo2:
1
2
3
4
5
6
7
8
require_once "Calculo2.php";
 
$calculo = new calculo2;
$calculo->dividir(); ou $calculo->somar();
 
print_r($calculo);
 
//resposta 5 ou 2
Mas digamos que no calculo 2 eu queira uma outra função dividir (4 por 2) que será específica apenas na minha aplicação (Calculo2.php) e com isso não quero mudar nada no arquivo Calculo1.php:
1
2
3
4
5
6
7
8
9
10
11
12
13
require_once "Calculo1.php";
 
class Calculo2 extends Calculo1{
    public $resposta;
 
    public function somar(){
        return $this->resposta = 1+1;
    }
 
    public function dividir(){
        return $this->resposta = 4/2;
    }
}
Nesse momento entra o “X” da questão, o polimorfismo. Quando eu mandar executar $calculo->dividir() o PHP procura dentro da minha classe Calculo2 a função dividir e, encontrando, executa a divisão 4/2 e, se ela não existir, ele irá executar a outra função dividir 10/5, que está dentro do arquivo Calculo2.php. Teoricamente poderíamos encontrar algum problema ao estender uma classe da outra e utilizar duas funções com o mesmo nome, mas é exatamente o contrário que o polimorfismo nos permite fazer.
Espero ter ajudado alguém com essa pequena e simples explicação.
Grande abraço!

Um comentário:

Felip Barbosa disse...

"ele irá executar a outra função dividir 10/5, que está dentro do arquivo Calculo2.php"
Na verdade, dentro do Calculo1.php; hehe
Muito boa explicação, objetiva e simples! As vezes só precisamos disso para entender o que o manual ou muitos outros sites tentam explicar.
Thanks!