Methodenüberschreibung
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 23 von 91.
Manchmal passt die geerbte Methode einer übergeordneten Klasse nicht ganz zu dem, was die untergeordnete Klasse benötigt. Durch das Überschreiben von Methoden kann eine untergeordnete Klasse ihre eigene Implementierung einer Methode bereitstellen, die bereits in der übergeordneten Klasse vorhanden ist.
Um eine Methode zu überschreiben, definiere einfach eine Methode in der untergeordneten Klasse mit demselben Namen wie die Methode der übergeordneten Klasse:
<?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();
Ausgabe:
Whiskers says meowDie Klasse Cat ersetzt die Methode speak() des Elternteils vollständig durch ihre eigene Version. Wenn du speak() für ein Katzenobjekt aufrufst, verwendet PHP die Implementierung des Kindes.
Du kannst das Verhalten des übergeordneten Elements auch erweitern, indem du parent:: mit deiner eigenen Logik kombinierst:
<?php
class Dog extends Animal {
public function speak() {
return parent::speak() . " - woof woof!";
}
}
$dog = new Dog("Rex");
echo $dog->speak();
Ausgabe:
Rex makes a sound - woof woof!Wichtiger Punkt: Das Überschreiben von Methoden ermöglicht es Unterklassen, geerbtes Verhalten anzupassen. Du kannst eine Methode vollständig ersetzen oder parent:: verwenden, um auf der ursprünglichen Implementierung aufzubauen.
Aufgabe
EinfachErstellen wir ein Benachrichtigungssystem, das veranschaulicht, wie untergeordnete Klassen Methoden der übergeordneten Klasse durch Methodenüberschreibung vollständig ersetzen oder erweitern können.
Du erstellst drei Dateien, die zusammenarbeiten, um verschiedene Arten von Benachrichtigungen zu senden, jeweils mit ihrem eigenen Verhalten:
Notification.php: Definiere eineNotification-Klasse, die als Grundlage für alle Benachrichtigungstypen dient. Sie sollte eine öffentliche Eigenschaft$recipientund einen Konstruktor haben, der den Empfänger entgegennimmt und setzt. Füge einesend($message)-Methode ein, die"Sending to [recipient]: [message]"zurückgibt.UrgentNotification.php: Definiere eineUrgentNotification-Klasse, dieNotificationerweitert. Binde die Notification-Datei am Anfang ein. Diese Klasse sollte diesend($message)-Methode vollständig überschreiben, sodass sie"URGENT to [recipient]: [message]!!!"zurückgibt: Beachte das Präfix „URGENT“ und die Ausrufezeichen am Ende. Dies veranschaulicht das vollständige Ersetzen des Verhaltens der übergeordneten Klasse.LoggedNotification.php: Definiere eineLoggedNotification-Klasse, dieNotificationerweitert. Binde die Notification-Datei am Anfang ein. Diese Klasse solltesend($message)überschreiben, dabei aber auf der Implementierung der übergeordneten Klasse aufbauen: Rufeparent::send($message)auf und hänge" [logged]"an das Ergebnis an. Dies veranschaulicht das Erweitern statt des Ersetzens von Verhalten.
Binde in main.php alle drei Benachrichtigungsklassendateien ein. Du erhältst zwei Eingaben: den Namen des Empfängers und die zu sendende Nachricht. Erstelle eine Instanz jedes Benachrichtigungstyps (alle mit demselben Empfänger) und rufe anschließend bei jeder Instanz send() mit der Nachricht auf. Gib jedes Ergebnis in einer eigenen Zeile und in dieser Reihenfolge aus: normale Benachrichtigung, dringende Benachrichtigung, dann protokollierte Benachrichtigung.
Diese Aufgabe zeigt beide Ansätze zur Methodenüberschreibung: UrgentNotification ersetzt die Logik der übergeordneten Klasse vollständig durch eine eigene Formatierung, während LoggedNotification parent:: verwendet, um das ursprüngliche Verhalten beizubehalten und zu erweitern.
Probier es selbst
<?php
require_once 'Notification.php';
require_once 'UrgentNotification.php';
require_once 'LoggedNotification.php';
// Eingabe lesen
$recipient = trim(fgets(STDIN));
$message = trim(fgets(STDIN));
// TODO: Erstelle eine Instanz von jedem Benachrichtigungstyp (alle mit demselben Empfänger)
// TODO: Rufe send() mit der Nachricht auf jeder Benachrichtigung auf
// Gib jedes Ergebnis in einer eigenen Zeile in dieser Reihenfolge aus:
// 1. Reguläre Benachrichtigung
// 2. Dringende Benachrichtigung
// 3. Protokollierte Benachrichtigung
?>Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in OOPKlassen vs. ObjekteDas Schlüsselwort $thisMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick – Einfacher Taschenrechner4Vererbung
Grundlegende VererbungDas Schlüsselwort parent::MethodenüberschreibungDas Schlüsselwort finalAbstrakte KlassenRückblick – Mitarbeiterhierarchie7Kapselung
Öffentlich, geschützt, privatZugriffsmodifikatoren im DetailGetter und SetterInformationsverbergungKonstruktor-Promotion (8.0)Wiederholung – System zur Verwaltung von Schülerdatensätzen2Namespaces & Autoloading
Einführung in NamespacesDas use-SchlüsselwortPSR-4-Autoloading-StandardComposer-AutoloaderRückblick – Organisiertes Projekt5Schnittstellen & Verträge
Einführung in SchnittstellenSchnittstellen implementierenMehrere Schnittstellen implementierenSchnittstelle vs. abstrakte KlasseTyp-Hinweise mit SchnittstellenRückblick – Formrechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objektklonen__serialize & __unserializeRückblick – Benutzerdefinierte Sammlung11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenBenutzerdefinierte Exception-HierarchieTry, Catch, FinallyRückblick – Formularvalidator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klassen-Eigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenSchreibgeschützte Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphie
Methodenüberschreibung erneut betrachtetPolymorphie über SchnittstellenTyp-Hinweise & Union-TypenSpätes statisches BindenRückblick – Zahlungsabwickler9Traits
Einführung in TraitsMehrere Traits verwendenAuflösung von Trait-KonfliktenAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungÜbe selbstständig: Online-PHP-Compiler