Polimorfismo consiste em um classe Filha sobrescrever a implementação de um método
herdado da classe Pai. Dessa forma, uma classe Filha pode utilizar um ou mais
métodos com a mesma assinatura, porém com comportamentos diferentes.
O que foi discutido acima é colocado em prática com a sobrescrita de métodos
nos exemplos 8 e 9 mostrados abaixo:
Exemplo 8: Sem polimorfismo
<?php
//main.php
class Pai
{
public $atributo = 100;
//construtor omitido
public function metodo(){
echo "Pai: metodo()","\n";
echo $this->atributo,"\n";
}
}
class Filha extends Pai{
//construtor omitido
}
//chamada ao método da classe Pai por Filha
$f = new Filha();
$f->metodo();
?>
Saída
Pai: metodo()
100
Exemplo 9: Com polimorfismo
<?php
//main.php
class Pai
{
public $atributo = 100;
//método que será sobrescrito
public function metodo(){
echo "Pai: metodo()","\n";
echo $this->atributo,"\n";
}
}
class Filha extends Pai{
//método sobrescrito
public function metodo(){
echo "Filha: metodo()","\n";
echo $this->atributo*2,"\n";
}
}
$p = new Pai();
$p->metodo();
$f = new Filha();
$f->metodo();
?>
Saída
Pai: metodo()
100
Filha: metodo()
200
Por padrão, qualquer método que utiliza os modificadores de acesso public e
protected pode sofrer polimorfismo quando sua classe for herdada.
Para evitar que um método não seja sobrescrito, a linguagem PHP possui é o modificador
de restrição final que deve ser utilizado na declaração de um método.
Sintaxe
modificador_acesso final nome_metodo(<lista_parametros>)
{
//omitido
}
Exemplo 10
<?php
//main.php
class Pai
{
public $atributo = 100;
//método que será sobrescrito
public final function metodo(){
echo "Pai: metodo()","\n";
echo $this->atributo,"\n";
}
}
class Filha extends Pai{
//método sobrescrito
public function metodo(){
echo "Filha: metodo()","\n";
echo $this->atributo*(0.10),"\n";
}
}
$f = new Filha();
//chamada ao método sobrescrito
$f->metodo();
?>
Saída
PHP Fatal error: Cannot override final method Pai::metodo() in main.php on line 17