Menu
Coddy logo textTech

Sobrescrita de Métodos Revisitada

Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy — lição 33 de 91.

Você já aprendeu sobre a sobrescrita de métodos no capítulo de Herança. Agora vamos explorar como isso 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, você 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 função makeAnimalSpeak() aceita 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 é polimorfismo em ação.

Esta abordagem permite que você escreva 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 mais tarde, e a função funcionará com elas automaticamente.

Ponto Chave: A sobrescrita de método habilita o polimorfismo ao permitir que diferentes classes respondam de forma diferente à mesma chamada de método, determinada em tempo de execução pelo tipo real do objeto.

challenge icon

Desafio

Fácil

Vamos construir um sistema de instrumentos musicais que demonstra polimorfismo através da sobrescrita de métodos. Você criará uma classe base Instrument e duas classes filhas que produzem, cada uma, seu próprio som único — depois, 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 classe Instrument com uma propriedade protegida $name definida através do construtor. Adicione um método play() que retorna "[name] makes a sound". Isso serve como o comportamento base que as classes filhas irão sobrescrever.
  • Guitar.php — Crie uma classe Guitar que estende Instrument. Inclua o arquivo pai. O construtor aceita o nome e o passa para o construtor pai. Sobrescreva o método play() para retornar "[name] strums a chord".
  • Drum.php — Crie uma classe Drum que estende Instrument. Inclua o arquivo pai. O construtor aceita o nome e o passa para o construtor pai. Sobrescreva o método play() para retornar "[name] beats a rhythm".
  • main.php — Inclua os arquivos Guitar e Drum. Crie uma função chamada performWith que aceita um parâmetro Instrument (com type-hint) e retorna o resultado da chamada de play() nele. Esta função demonstra o polimorfismo — ela funciona com qualquer tipo de instrumento através do type hint 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 — a guitarra primeiro, 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!

Folha de consulta

Polimorfismo significa "muitas formas" e permite que objetos de diferentes classes sejam tratados por meio de seu tipo pai, mantendo seu comportamento específico.

Quando você sobrescreve um método em classes filhas, o PHP chama automaticamente a versão correta com base no tipo real do objeto em tempo de execução:

<?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()); // Woof!
echo makeAnimalSpeak(new Cat()); // Meow!

A função makeAnimalSpeak() aceita qualquer tipo Animal por meio de seu "type hint" de parâmetro. Ela não precisa conhecer a classe específica - o PHP determina qual método sobrescrito chamar em tempo de execução com base no tipo real do objeto.

Isso permite um código flexível que funciona com uma família de objetos relacionados sem conhecer seus tipos específicos. Novas classes filhas podem ser adicionadas posteriormente e funcionarão automaticamente com as funções existentes.

Experimente você mesmo

<?php
// Inclua os arquivos de 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:
// - Aceite um parâmetro Instrument (use o type hint: Instrument $instrument)
// - Retorne o resultado da chamada de play() no instrumento

// TODO: Crie um Guitar com $guitarName e um Drum com $drumName
// TODO: Passe cada um para performWith() e imprima os resultados (guitarra primeiro, depois bateria)

?>
quiz iconTeste seus conhecimentos

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