Menu
Coddy logo textTech

Sovrascrittura dei metodi

Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 23 di 91.

A volte il metodo ereditato da una classe genitore non si adatta del tutto alle esigenze della classe figlia. L'override dei metodi consente a una classe figlia di fornire una propria implementazione di un metodo già presente nella classe genitore.

Per sovrascrivere un metodo, definisci semplicemente un metodo nella classe figlia con lo stesso nome del metodo della classe genitore:

<?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();

Output:

Whiskers says meow

La classe Cat sostituisce completamente il metodo speak() della classe genitore con la propria versione. Quando chiami speak() su un oggetto gatto, PHP usa l'implementazione della classe figlia.

Puoi anche estendere il comportamento del genitore combinando parent:: con la tua logica:

<?php
class Dog extends Animal {
    public function speak() {
        return parent::speak() . " - woof woof!";
    }
}

$dog = new Dog("Rex");
echo $dog->speak();

Output:

Rex makes a sound - woof woof!

Punto chiave: L'override dei metodi consente alle classi figlie di personalizzare il comportamento ereditato. Puoi sostituire completamente un metodo oppure usare parent:: per ampliare l'implementazione originale.

challenge icon

Sfida

Facile

Costruiamo un sistema di notifiche che mostra come le classi figlie possano sostituire completamente o estendere i metodi delle classi genitore tramite l'override dei metodi.

Creerai tre file che collaborano per inviare diversi tipi di notifiche, ciascuno con un comportamento specifico:

  • Notification.php: Definisci una classe Notification che funge da base per tutti i tipi di notifica. Deve avere una proprietà pubblica $recipient e un costruttore che accetta e imposta il destinatario. Includi un metodo send($message) che restituisce "Sending to [recipient]: [message]".
  • UrgentNotification.php: Definisci una classe UrgentNotification che estende Notification. Includi il file Notification all'inizio. Questa classe deve sovrascrivere completamente il metodo send($message) per restituire "URGENT to [recipient]: [message]!!!": nota il prefisso "URGENT" e i punti esclamativi alla fine. Questo dimostra la sostituzione completa del comportamento della classe genitore.
  • LoggedNotification.php: Definisci una classe LoggedNotification che estende Notification. Includi il file Notification all'inizio. Questa classe deve sovrascrivere send($message), basandosi però sull'implementazione della classe genitore: chiama parent::send($message) e aggiungi " [logged]" al risultato. Questo dimostra come estendere il comportamento invece di sostituirlo.

In main.php, includi tutti e tre i file delle classi di notifica. Riceverai due input: il nome del destinatario e il messaggio da inviare. Crea un'istanza di ciascun tipo di notifica (usando lo stesso destinatario per tutte), poi chiama send() con il messaggio su ciascuna di esse. Stampa ogni risultato su una riga separata, in questo ordine: notifica normale, notifica urgente, poi notifica registrata.

Questa sfida mostra entrambi gli approcci all'override dei metodi: UrgentNotification sostituisce completamente la logica della classe genitore con una propria formattazione, mentre LoggedNotification usa parent:: per mantenere il comportamento originale e aggiungervi qualcosa.

Provalo tu

<?php

require_once 'Notification.php';
require_once 'UrgentNotification.php';
require_once 'LoggedNotification.php';

// Leggi l'input
$recipient = trim(fgets(STDIN));
$message = trim(fgets(STDIN));

// TODO: Crea un'istanza di ogni tipo di notifica (tutte usando lo stesso destinatario)

// TODO: Chiama send() con il messaggio su ogni notifica
// Stampa ogni risultato su una riga separata in questo ordine:
// 1. Notifica normale
// 2. Notifica urgente
// 3. Notifica registrata

?>
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore PHP online