Menu
Coddy logo textTech

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 meow

A 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.

challenge icon

Desafio

Fácil

Vamos 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 classe Notification que servirá como base para todos os tipos de notificação. Ela deve ter uma propriedade pública $recipient e um construtor que aceite e defina o destinatário. Inclua um método send($message) que retorne "Sending to [recipient]: [message]".
  • UrgentNotification.php: Defina uma classe UrgentNotification que estenda Notification. Inclua o arquivo Notification no início. Essa classe deve sobrescrever completamente o método send($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 classe LoggedNotification que estenda Notification. Inclua o arquivo Notification no início. Essa classe deve sobrescrever send($message), mas basear-se na implementação da classe pai: chame parent::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

?>
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

Pratique por conta própria: Compilador de PHP online