Grundlagen der 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, können Sie eine Basisklasse mit gemeinsamer Funktionalität erstellen und andere Klassen davon erben lassen.
Die Klasse, von der geerbt wird, wird als Elternklasse (oder Basisklasse) bezeichnet, und die Klasse, die erbt, wird als Kindklasse bezeichnet. Sie verwenden 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 Methode speak() von Animal. Sie definiert außerdem ihre eigene Methode fetch(), 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, während sie ihr eigenes spezialisiertes Verhalten hinzufügt.
Wichtiger Punkt: Vererbung fördert die Wiederverwendung von Code und stellt logische Beziehungen zwischen Klassen her. Die Kindklasse erbt alle öffentlichen (public) und geschützten (protected) Member von der Elternklasse, was Redundanz reduziert und die Wartung Ihres Codes erleichtert.
Aufgabe
EinfachLassen Sie uns ein Fahrzeughierarchie-System erstellen, das zeigt, wie Vererbung es Kindklassen ermöglicht, Funktionen einer Elternklasse zu teilen und gleichzeitig ihr eigenes spezialisiertes Verhalten hinzuzufügen.
Sie werden Ihren Code über drei Dateien organisieren:
Vehicle.php— Definieren Sie 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 setzt. Fügen Sie einestart()-Methode hinzu, die"[brand] is starting"zurückgibt, und einestop()-Methode, die"[brand] is stopping"zurückgibt.Motorcycle.php— Definieren Sie eineMotorcycle-Klasse, dieVehicleerweitert. Binden Sie die Vehicle-Datei am Anfang ein. Die Motorcycle-Klasse benötigt keinen eigenen Konstruktor, da sie den Konstruktor der Elternklasse erbt. Fügen Sie einewheelie()-Methode hinzu, die"[brand] is doing a wheelie!"zurückgibt — dies ist ein Verhalten, das spezifisch für Motorräder ist.main.php— Binden Sie die Motorcycle-Datei ein (welche bereits Vehicle einbindet). Sie erhalten eine Eingabe: die Motorradmarke. Erstellen Sie einMotorcycle-Objekt mit dieser Marke. Geben Sie das Ergebnis des Aufrufs vonstart(), dannwheelie()und schließlichstop()aus, jeweils in einer eigenen Zeile.
Beachten Sie, wie die Motorcycle-Klasse automatisch die $brand-Eigenschaft, den Konstruktor sowie die 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. Dies ist die Stärke der Vererbung: Schreiben Sie gemeinsame Funktionalität einmal in der Elternklasse und lassen Sie die Kinder diese wiederverwenden, während sie ihre eigenen Spezialisierungen hinzufügen.
Spickzettel
Vererbung ermöglicht es einer Klasse, Eigenschaften und Methoden von einer anderen Klasse unter Verwendung des Schlüsselworts extends zu übernehmen. Die Klasse, von der geerbt wird, wird als Elternklasse (oder Basisklasse) bezeichnet, und die Klasse, die erbt, wird als Kindklasse bezeichnet.
<?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(); // Buddy makes a sound
echo $dog->fetch(); // Buddy fetches the ball
Die Kindklasse erbt alle öffentlichen und geschützten Elemente von der Elternklasse, einschließlich Eigenschaften, Konstruktoren und Methoden. Die Kindklasse kann auch eigene spezialisierte Methoden und Eigenschaften hinzufügen.
Vererbung fördert die Wiederverwendbarkeit von Code und stellt logische Beziehungen zwischen Klassen her, wodurch Redundanz reduziert und der Code einfacher zu warten ist.
Probier es selbst
<?php
// Binde die Motorcycle-Klasse ein (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 die OOPKlassen vs. ObjekteDas $this-SchlüsselwortMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick - Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDas parent:: SchlüsselwortMethoden überschreibenDas final SchlüsselwortAbstrakte KlassenZusammenfassung – Mitarbeiter-Hierarchie7Kapselung
Public, Protected, PrivateZugriffsmodifikatoren im DetailGetter und SetterInformation HidingConstructor Promotion (8.0)Zusammenfassung – Studentenverwaltungssystem2Namensräume & Autoloading
Einführung in NamensräumeDas use-SchlüsselwortPSR-4 Autoloading-StandardComposer AutoloaderZusammenfassung – Organisiertes Projekt5Interfaces & Verträge
Einführung in InterfacesInterfaces implementierenMehrfache Interface-ImplementierungInterface vs. Abstrakte KlasseType Hinting mit InterfacesZusammenfassung – Formen-Rechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objekt-Klonen__serialize & __unserializeZusammenfassung - Eigene Collection11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenEigene Exception-HierarchieTry, Catch, FinallyZusammenfassung - Formular-Validator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klasseneigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenReadonly-Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphismus
Method Overriding erneut betrachtetPolymorphismus über InterfacesType Hinting & Union TypesLate Static BindingZusammenfassung – Payment Processor9Traits
Einführung in TraitsVerwendung mehrerer TraitsKonfliktlösung bei TraitsAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung