Artigo: Herança e Polimorfismo em PHP - Gigasystems

PHP

Em por

heranca-e-polimorfismo-em-php
Herança e Polimorfismo em PHP

No artigo de hoje veremos como funciona herança e polimorfismo em PHP Orientado a Objetos, criando classes e subclasses (classes derivadas, ou classe filha) que herdam propriedades e métodos de superclasse (classe pai).

herança e polimorfismo

Assim como no mundo real, a palavra herança se refere ao conceito de receber algo, herdar algo de alguém. Herança aqui pode ser entendida como um mecanismo que permite construir uma nova classe com base em uma classe previamente existente, em que a nova herda automaticamente todos os atributos, comportamentos e implementações da classe-pai.

Em se tratando de herança, estamos falando de um dos maiores benefícios da Orientação a Objetos, além da capacidade de encapsulamento. Com a herança podemos reutilizar partes de código já definidos, além da agilidade, ela elimina a necessidade de duplicar ou rescrever certo código.

Essas características nos permitem ao invés de escrevermos uma estrutura totalmente nova, reaproveitar a estrutura existente mesmo que a mesma nos forneça apenas uma base abstrata para o desenvolvimento. Você verá que não é necessário reescrever códigos já escritos anteriormente, caso precise do código de alguma classe já criada, basta criar uma subclasse (classe derivada) e ela terá todas as propriedades e métodos de sua mãe (superclasse).

Além disso, você também vai aprender polimorfismo, que significa ter a capacidade de sobrescrever métodos das superclasses nas subclasses. Isso significa que você poderá ter métodos de mesmo nome na superclasse e subclasse, porém, com ações diferentes.

Se na subclasse é escrito um método com o mesmo nome do método existente na classe pai, passa a vigorar o método da classe filha (subclasse).

Para acessar os métodos sobrescritos ou membros estáticos da classe pai, utilizamos a palavra reservada parent. É importante destacar que somente os métodos protect e public podem ser reescritos.

Herança em PHP Orientado a Objetos

Como havíamos mencionado, temos superclasses e subclasses na orientação a objetos, sendo que:

  • Superclasses são classes mãe, que não derivam de nenhuma outra classe.
  • Subclasses são classes que são criadas a partir de outras classes (seriam filhas das outras classes) e herdam todas as propriedades e métodos das superclasses.

A superclasse (ou classe mãe)


 class Configura { protected $valor = 'Valor qualquer'; protected function inverte ( $oque ) { return strrev( $oque ); } }

Veja que tenho uma propriedade:

 protected $valor = 'Valor qualquer';

E um método:

 protected function inverte ( $oque ) { return strrev( $oque ); } 

Perceba também, que ambos são "protected", ou seja, não podem ser acessados diretamente pelo programa, somente pela superclasse e suas subclasses.

No método, estou apenas chamando uma função que inverte os valores de uma string qualquer, com strrev.

A subclasse (ou classe filha)


 class Mostra extends Configura { public function view () { return parent::inverte( $this->valor ); } }

Essa classe não tem nenhuma propriedade, porém, tem um método públic (public) chamado view. Este método não faz nada além de retornar um valor.

O que pode ser confuso aqui, é que a subclasse acima não tem nenhuma propriedade chamada "valor", ou método chamado "inverte", e mesmo assim, consigo utilizar ambos indiretamente quando crio o objeto e chamo o método view:

 $mostra = new Mostra(); echo $mostra->view();

Isso acontece porque a subclasse herdou tudo o que continha na superclasse, tanto propriedades quanto métodos.

Para acessar propriedades da superclasse na subclasse, simplesmente utilize a palavra reservada $this.

 <?php // Superclasse class Configura { protected $valor = 'Valor qualquer'; } ?> <?php // Subclasse class Mostra extends Configura { function __construct() { // Exibe o valor da superclasse echo $this->valor; } } ?> // Objeto da subclasse $mostra = new Mostra();

Veja que $this->valor está exibindo o valor da superclasse, mesmo estando dentro da subclasse.

Porém, se você criar outra propriedade de mesmo nome na subclasse, a propriedade da superclasse será sobrescrita, e o valor da subclasse passará a valer.

 <?php // Superclasse class Configura { protected $valor = 'Valor qualquer'; } // Subclasse class Mostra extends Configura { // Agora $valor tem outro valor protected $valor = 'Outro valor'; function __construct() { // Exibe o valor da superclasse echo $this->valor; } } // Objeto da subclasse $mostra = new Mostra();

Além disso, também posso utilizar as palavras parent (para me referir à superclasse) e self (para fazer referência à classe atual, ou classe filha).

Exemplo:

 <?php // Superclasse class Configura { protected $valor = 'Valor qualquer'; // Método ver() na superclasse protected function ver () { return 'Classe mãe: ' . $this->valor . '<br>'; } } // Subclasse class Mostra extends Configura { public $valor = 'Outro valor'; function __construct() { // Exibe o valor da superclasse echo self::ver(); // Subclasse echo parent::ver(); // Superclasse echo $this->ver(); // Subclasse } // Método ver() na subclasse protected function ver () { return 'Classe filha: ' . $this->valor . '<br>'; } } // Objeto da subclasse $mostra = new Mostra();

Polimorfismo em PHP Orientado a Objetos

Polimorfismo simplesmente significa reescrever um método da superclasse na subclasse, e assim podendo determinar novos comportamentos desse método.

 <?php // Superclasse class Configura { public function ver () { echo 'Sou a superclasse! <br>'; } function __construct() { $this->ver(); } } // Subclasse class Mostra extends Configura { public function ver () { echo 'Sou a subclasse! <br>'; } function __construct() { $this->ver(); } } // Objeto da superclasse $superclasse = new Configura(); // Objeto da subclasse $subclasse = new Mostra();

O método "ver( )", foi reescrito na subclasse, por isso, terá um resultado diferente da sua classe mãe, a superclasse.

Se eu apagar o método da subclasse, teremos duas vezes a mensagem: "Sou a superclasse!" na tela.

 <?php // Superclasse class Configura { public function ver () { echo 'Sou a superclasse! <br>'; } function __construct() { $this->ver(); } } // Subclasse class Mostra extends Configura { function __construct() { $this->ver(); } } // Objeto da superclasse $superclasse = new Configura(); // Objeto da subclasse $subclasse = new Mostra();

Vale lembrar que o PHP não suporta herança múltipla, isso pode ser feito com o uso de interfaces.

Com estes recursos, expandimos nosso código, sem reescrevê-lo, isso é extremamente comum quando se trata de criar novas funcionalidades em um software, e com certeza seu código ficará mais bonito e fácil de entender.

Dúvidas, críticas ou sugestões comentem abaixo. =)

Olá, deixe seu comentário para Herança e Polimorfismo em PHP

Já temos 7 comentário(s). DEIXE O SEU :)
Matheus Silva

Matheus Silva

Simples e objetivo, parabéns!
★★★★★DIA 11.03.21 13h41RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
Wanderson Silva

Wanderson Silva

No último código sobre classe filhas antes de entrar em polimorfismo se rodarmos ele vai retornar assim:
Classe filha: Outro valor
Classe mãe: Outro valor
Classe filha: Outro valor

O retorno "Classe mãe: Outro valor" que não entendi porque o comando dado nele foi o echo parent::ver();
E o parent retornou a string da superclasse e o contéudo da proprieadade da classe filha. No meu entendimento era para retornar assim:
Classe mãe: Valor qualquer
★★★★★DIA 27.12.20 19h26RESPONDER
N/A
Enviando Comentário Fechar :/
Elizeu Alcantara

Elizeu Alcantara

Ola Wanderson, boa observacao... tb rodei e realmente tem um bug ali...
Troque
protected $valor = 'Valor qualquer';
por
private $valor = 'Valor qualquer';

Abs
★★★★★DIA 28.02.21 22h04RESPONDER
N/A
Enviando Comentário Fechar :/
Bruno Coelho

Bruno Coelho

Ótimo artigo!
★★★★★DIA 15.09.20 11h54RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
Diogo Batista

Diogo Batista

Aprendi da melhor forma possível :D
★★★★★DIA 09.10.19 22h46RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
Angela Carvalho

Angela Carvalho

Gostei muito da abordagem simples e direta. Parabéns!
★★★★★DIA 15.03.19 19h10RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
junior

junior

Muito bom amigo! PHP é show, orientado a objetos então, nem se fala!
★☆☆☆☆DIA 05.02.16 09h02RESPONDER
N/A
Enviando Comentário Fechar :/
Enviando Comentário Fechar :/

Veja Também:

Artigos Relacionados a categoria: PHP

Soluções

...CURTIU? AINDA NÃO VIU NOSSO PORTFÓLIO?


Se ainda não viu nosso Portfólio e quer conhecer um pouco mais... aproveite, veja agora mesmo nossos Cases de Sucesso e tenha seu site nos padrões atuais preparado para maioria dos dispositivos e navegadores.

Usamos cookies para manter o site seguro, registrar e personalizar sua navegação. Para mais detalhes sobre essa atividade, acesse nossa Politica de Privacidade

Entendi