Revisão da Sobrescrita de Métodos
Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy. Lição 33 de 91.
Você já aprendeu sobre sobrescrita de métodos no capítulo sobre herança. Agora vamos explorar como ela se conecta ao polimorfismo — um dos conceitos mais poderosos da programação orientada a objetos.
Polimorfismo significa “muitas formas”. Quando você sobrescreve um método em uma classe filha, está dando a esse método uma forma diferente, mantendo o mesmo nome. A mágica acontece quando você trabalha com objetos por meio de seu tipo pai:
<?php
class Animal {
public function speak() {
return "Some sound";
}
}
class Dog extends Animal {
public function speak() {
return "Woof!";
}
}
class Cat extends Animal {
public function speak() {
return "Meow!";
}
}
function makeAnimalSpeak(Animal $animal) {
return $animal->speak();
}
echo makeAnimalSpeak(new Dog()) . "\n";
echo makeAnimalSpeak(new Cat());
Saída:
Woof!
Meow!A function makeAnimalSpeak() accepts qualquer Animal. Ela não sabe nem se importa se recebe um Dog ou Cat. O PHP chama automaticamente o método sobrescrito correto com base no tipo real do objeto em tempo de execução.
Isso é o polimorfismo em ação.
Essa abordagem permite escrever um código flexível que funciona com uma família de objetos relacionados sem conhecer seus tipos específicos. Você pode adicionar novas classes de animais posteriormente, e a função funcionará com elas automaticamente.
Ponto-chave: A sobrescrita de métodos possibilita o polimorfismo ao permitir que diferentes classes respondam de maneira diferente à mesma chamada de método, determinada em tempo de execução pelo tipo real do objeto.
Desafio
FácilVamos criar um sistema de instrumentos musicais que demonstra polimorfismo por meio da sobrescrita de métodos. Você criará uma classe base Instrument e duas classes filhas, cada uma produzindo seu próprio som exclusivo; em seguida, usará uma única função para tocar qualquer instrumento de forma polimórfica.
Você organizará seu código em quatro arquivos:
Instrument.php: crie uma classeInstrumentcom uma propriedade$nameprotegida, definida por meio do construtor. Adicione um métodoplay()que retorne"[name] makes a sound". Esse será o comportamento base que as classes filhas sobrescreverão.Guitar.php: crie uma classeGuitarque estendaInstrument. Inclua o arquivo pai. O construtor aceita o nome e o passa para o construtor pai. Sobrescreva o métodoplay()para retornar"[name] strums a chord".Drum.php: crie uma classeDrumque estendaInstrument. Inclua o arquivo pai. O construtor aceita o nome e o passa para o construtor pai. Sobrescreva o métodoplay()para retornar"[name] beats a rhythm".main.php: inclua os arquivos Guitar e Drum. Crie uma função chamadaperformWithque aceite um parâmetroInstrument(com declaração de tipo) e retorne o resultado da chamada deplay()nele. Essa função demonstra o polimorfismo. Ela funciona com qualquer tipo de instrumento por meio da declaração de tipo da classe pai.
Você receberá duas entradas: um nome para a guitarra e um nome para o tambor. Crie um Guitar e um Drum com esses nomes. Passe cada um para sua função performWith() e imprima os resultados: primeiro a guitarra e depois o tambor, cada um em sua própria linha.
Observe como performWith() aceita qualquer Instrument, mas o PHP chama automaticamente o método play() sobrescrito correto com base no tipo real do objeto em tempo de execução. Isso é o polimorfismo em ação!
Experimente você mesmo
<?php
// Inclua os arquivos dos instrumentos
require_once 'Guitar.php';
require_once 'Drum.php';
// Leia a entrada
$guitarName = trim(fgets(STDIN));
$drumName = trim(fgets(STDIN));
// TODO: Crie uma função chamada performWith que:
// - Aceita um parâmetro Instrument (use type hint: Instrument $instrument)
// - Retorna o resultado de chamar play() no instrumento
// TODO: Crie um Guitar com $guitarName e um Drum com $drumName
// TODO: Passe cada um para performWith() e imprima os resultados (guitar primeiro, depois drum)
?>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