Grundlegende Vererbung
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 21 von 91.
Vererbung ermöglicht es einer Klasse, Eigenschaften und Methoden von einer anderen Klasse zu übernehmen. Anstatt denselben Code neu zu schreiben, kannst du eine Basisklasse mit gemeinsam genutzter Funktionalität erstellen und andere Klassen von ihr erben lassen.
Die Klasse, von der geerbt wird, wird als Basisklasse (oder Elternklasse) bezeichnet, und die Klasse, die erbt, wird als Kindklasse bezeichnet. Du verwendest das Schlüsselwort extends, um diese Beziehung herzustellen:
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function speak() {
return "$this->name makes a sound";
}
}
class Dog extends Animal {
public function fetch() {
return "$this->name fetches the ball";
}
}
$dog = new Dog("Buddy");
echo $dog->speak() . "\n";
echo $dog->fetch();
Ausgabe:
Buddy makes a sound
Buddy fetches the ballDie Klasse Dog hat automatisch Zugriff auf die Eigenschaft $name, den Konstruktor und die speak()-Methode von Animal. Sie definiert außerdem ihre eigene fetch()-Methode, die nur Hunde haben.
Dies schafft eine klare Hierarchie: Jeder Hund ist ein Tier, daher ist es sinnvoll, dass Dog von Animal erbt. Die Kindklasse kann alles von der Elternklasse verwenden und gleichzeitig ihr eigenes spezialisiertes Verhalten hinzufügen.
Wichtiger Punkt: Vererbung fördert die Wiederverwendung von Code und stellt logische Beziehungen zwischen Klassen her. Die untergeordnete Klasse erbt alle öffentlichen und geschützten Member von der übergeordneten Klasse, wodurch Duplikate reduziert und dein Code leichter wartbar wird.
Aufgabe
EinfachErstellen wir ein Fahrzeugsystem mit einer Hierarchie, das veranschaulicht, wie Vererbung es Kindklassen ermöglicht, Funktionalität von einer Elternklasse zu übernehmen und gleichzeitig eigene spezialisierte Verhaltensweisen hinzuzufügen.
Du wirst deinen Code auf drei Dateien verteilen:
Vehicle.php: Definiere eineVehicle-Klasse, die als Elternklasse für alle Fahrzeuge dient. Sie sollte eine öffentliche$brand-Eigenschaft und einen Konstruktor haben, der die Marke entgegennimmt und festlegt. Füge einestart()-Methode hinzu, die"[brand] is starting"zurückgibt, sowie einestop()-Methode, die"[brand] is stopping"zurückgibt.Motorcycle.php: Definiere eineMotorcycle-Klasse, dieVehicleerweitert. Binde die Vehicle-Datei am Anfang ein. Die Motorcycle-Klasse benötigt keinen eigenen Konstruktor, da sie den Konstruktor der Elternklasse erbt. Füge einewheelie()-Methode hinzu, die"[brand] is doing a wheelie!"zurückgibt. Dies ist ein Verhalten, das nur Motorräder besitzen.main.php: Binde die Motorcycle-Datei ein, die bereits Vehicle einbindet. Du erhältst eine Eingabe: die Marke des Motorrads. Erstelle einMotorcycle-Objekt mit dieser Marke. Gib das Ergebnis des Aufrufs vonstart(), dann vonwheelie()und anschließend vonstop()aus, jeweils in einer eigenen Zeile.
Beachte, wie die Motorcycle-Klasse automatisch die $brand-Eigenschaft, den Konstruktor sowie die beiden Methoden start() und stop() von Vehicle erbt. Die Kindklasse muss nur definieren, was sie einzigartig macht – in diesem Fall die Fähigkeit, einen Wheelie zu machen. Das ist die Stärke der Vererbung: Schreibe gemeinsame Funktionalität einmal in der Elternklasse und ermögliche es den Kindern, sie wiederzuverwenden und gleichzeitig eigene Spezialisierungen hinzuzufügen.
Probier es selbst
<?php
// Die Motorcycle-Klasse einbinden (die bereits Vehicle enthält)
require_once 'Motorcycle.php';
// Eingabe lesen
$brand = trim(fgets(STDIN));
// TODO: Erstelle ein Motorcycle-Objekt mit der Marke
// TODO: Gib das Ergebnis von start() aus
// TODO: Gib das Ergebnis von wheelie() aus
// TODO: Gib das Ergebnis von stop() aus
?>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