Sobrescrita de Métodos
Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy. Lição 23 de 91.
Às vezes, o método herdado de uma classe pai não se adapta exatamente ao que a classe filha precisa. A sobrescrita de métodos permite que uma classe filha forneça sua própria implementação de um método que já existe na classe pai.
Para sobrescrever um método, basta definir um método na classe filha com o mesmo nome do método da classe pai:
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function speak() {
return "$this->name makes a sound";
}
}
class Cat extends Animal {
public function speak() {
return "$this->name says meow";
}
}
$cat = new Cat("Whiskers");
echo $cat->speak();
Saída:
Whiskers says meowA classe Cat substitui completamente o método speak() da classe pai por sua própria versão. Quando você chama speak() em um objeto gato, o PHP usa a implementação da classe filha.
Você também pode estender o comportamento de parent:: combinando-o com sua própria lógica:
<?php
class Dog extends Animal {
public function speak() {
return parent::speak() . " - woof woof!";
}
}
$dog = new Dog("Rex");
echo $dog->speak();
Saída:
Rex makes a sound - woof woof!Ponto principal: A sobrescrita de métodos permite que as classes filhas personalizem o comportamento herdado. Você pode substituir completamente um método ou usar parent:: para desenvolver a implementação original.
Desafio
FácilVamos criar um sistema de notificações que demonstra como classes filhas podem substituir ou estender completamente métodos da classe pai por meio da sobrescrita de métodos.
Você criará três arquivos que trabalham juntos para enviar diferentes tipos de notificações, cada um com seu próprio comportamento exclusivo:
Notification.php: Defina uma classeNotificationque servirá como base para todos os tipos de notificação. Ela deve ter uma propriedade pública$recipiente um construtor que aceite e defina o destinatário. Inclua um métodosend($message)que retorne"Sending to [recipient]: [message]".UrgentNotification.php: Defina uma classeUrgentNotificationque estendaNotification. Inclua o arquivo Notification no início. Essa classe deve sobrescrever completamente o métodosend($message)para retornar"URGENT to [recipient]: [message]!!!": observe o prefixo "URGENT" e os pontos de exclamação no final. Isso demonstra a substituição completa do comportamento da classe pai.LoggedNotification.php: Defina uma classeLoggedNotificationque estendaNotification. Inclua o arquivo Notification no início. Essa classe deve sobrescreversend($message), mas basear-se na implementação da classe pai: chameparent::send($message)e acrescente" [logged]"ao resultado. Isso demonstra a extensão, em vez da substituição, do comportamento.
Em main.php, inclua os três arquivos de classes de notificação. Você receberá duas entradas: o nome do destinatário e a mensagem a ser enviada. Crie uma instância de cada tipo de notificação (todas usando o mesmo destinatário) e, em seguida, chame send() com a mensagem em cada uma delas. Imprima cada resultado em sua própria linha, nesta ordem: notificação regular, notificação urgente e, depois, notificação registrada.
Este desafio mostra as duas abordagens para sobrescrever métodos: UrgentNotification substitui completamente a lógica da classe pai por sua própria formatação, enquanto LoggedNotification usa parent:: para manter o comportamento original e acrescentar algo a ele.
Experimente você mesmo
<?php
require_once 'Notification.php';
require_once 'UrgentNotification.php';
require_once 'LoggedNotification.php';
// Ler entrada
$recipient = trim(fgets(STDIN));
$message = trim(fgets(STDIN));
// TODO: Crie uma instância de cada tipo de notificação (todas usando o mesmo destinatário)
// TODO: Chame send() com a mensagem em cada notificação
// Imprima cada resultado em sua própria linha nesta ordem:
// 1. Notificação regular
// 2. Notificação urgente
// 3. Notificação logada
?>Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP
Arquivos externosIntrodução à OOPClasses vs. objetosA palavra-chave $thisMétodosPropriedadesConstrutor (__construct)Destrutor (__destruct)Recapitulação - Calculadora simples4Herança
Herança BásicaA Palavra-chave parent::Sobrescrita de MétodosA Palavra-chave finalClasses AbstratasRecapitulação - Hierarquia de Funcionários7Encapsulamento
Público, Protegido, PrivadoModificadores de Acesso em ProfundidadeGetters e SettersOcultação de InformaçõesPromoção de Construtor (8.0)Recapitulação - Sistema de Registros de Alunos10Conceitos Avançados de OOP
Composição vs. HerançaInjeção de DependênciaClasses AnônimasEnums (PHP 8.1)Fibras (PHP 8.1)Análise Profunda da Clonagem de ObjetosGeradores e Iteradores13Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository2Namespaces e Autoloading
Introdução a NamespacesA palavra-chave usePadrão de Autoloading PSR-4Autoloader do ComposerRecapitulação - Projeto organizado5Interfaces e Contratos
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesInterface vs Classe AbstrataTipagem com InterfacesRecapitulação - Calculadora de Formas8Métodos Mágicos
Introdução aos Métodos Mágicos__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e Clonagem de Objetos__serialize e __unserializeRecapitulação - Coleção Personalizada11Sistema de Tipos e Tratamento de Erros
Declarações de TiposTipos NulosTipos de União e InterseçãoClasses de ExceçãoHierarquia de Exceções PersonalizadaTry, Catch, FinallyRecapitulação - Validador de Formulário14Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses de Livros e Usuários3Propriedades de Classes
Propriedades de Instância vs. EstáticasConstantes em ClassesMétodos e Propriedades EstáticosPropriedades Privadas e ProtegidasPropriedades Somente para Leitura (PHP 8.1)Recapitulação - Gerenciador de Contas Bancárias6Polimorfismo
Revisão da Sobrescrita de MétodosPolimorfismo via InterfacesIndicação de Tipos e Tipos UnionVinculação Estática TardiaRecapitulação - Processador de Pagamentos9Traits
Introdução a TraitsUsando Múltiplos TraitsResolução de Conflitos entre TraitsMétodos Abstratos em TraitsTraits vs. Herança12Padrões de Projeto – Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão StrategyPratique por conta própria: Compilador de PHP online