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 meowLa 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.
Sfida
FacileCostruiamo 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 classeNotificationche funge da base per tutti i tipi di notifica. Deve avere una proprietà pubblica$recipiente un costruttore che accetta e imposta il destinatario. Includi un metodosend($message)che restituisce"Sending to [recipient]: [message]".UrgentNotification.php: Definisci una classeUrgentNotificationche estendeNotification. Includi il file Notification all'inizio. Questa classe deve sovrascrivere completamente il metodosend($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 classeLoggedNotificationche estendeNotification. Includi il file Notification all'inizio. Questa classe deve sovrascriveresend($message), basandosi però sull'implementazione della classe genitore: chiamaparent::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
?>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
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave $thisMetodiProprietàCostruttore (__construct)Distruttore (__destruct)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa parola chiave parent::Sovrascrittura dei metodiLa parola chiave finalClassi astratteRiepilogo - Gerarchia dei dipendenti7Incapsulamento
Pubblico, Protetto, PrivatoApprofondimento sui modificatori di accessoGetter e SetterOccultamento delle informazioniPromozione dei parametri del costruttore (8.0)Riepilogo - Sistema di gestione dei registri degli studenti10Concetti avanzati di programmazione a oggetti
Composizione vs ereditarietàDependency InjectionClassi anonimeEnumerazioni (PHP 8.1)Fibers (PHP 8.1)Approfondimento sulla clonazione degli oggettiGeneratori e iteratori13Modelli di progettazione, parte 2
Modello CommandModello AdapterModello DecoratorModello Template MethodModello StateModello CompositeModello Repository2Namespace e autoloading
Introduzione ai namespaceLa keyword useStandard di autoloading PSR-4Autoloader di ComposerRiepilogo - Progetto organizzato5Interfacce e contratti
Introduzione alle interfacceImplementare le interfacceImplementare più interfacceInterfaccia vs classe astrattaType hinting con le interfacceRiepilogo - Calcolatore di forme8Metodi magici
Introduzione ai metodi magici__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e clonazione degli oggetti__serialize e __unserializeRiepilogo - Collezione personalizzata11Sistema dei tipi e gestione degli errori
Dichiarazioni di tipoTipi nullableTipi unione e intersezioneClassi di eccezioneGerarchia di eccezioni personalizzataTry, Catch, FinallyRiepilogo - Validatore di moduli14Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Proprietà delle classi
Proprietà di istanza e staticheCostanti nelle classiMetodi e proprietà staticiProprietà private e protectedProprietà readonly (PHP 8.1)Riepilogo - Gestore di conti bancari6Polimorfismo
Ridefinizione dei metodi, ripresaPolimorfismo tramite interfacceSuggerimenti sui tipi e tipi UnionBinding statico tardivoRiepilogo - Processore di pagamenti9Tratti
Introduzione ai trattiUtilizzare più trattiRisoluzione dei conflitti tra trattiMetodi astratti nei trattiTratti vs ereditarietà12Design pattern - Parte 1
Introduzione ai design patternPattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore PHP online