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 von ihr 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 und gleichzeitig ihr eigenes spezialisiertes Verhalten hinzufügen.
Kernpunkt: Vererbung fördert die Wiederverwendung von Code und stellt logische Beziehungen zwischen Klassen her. Die Kindklasse erbt alle public und protected Member von der Elternklasse, was Redundanz reduziert und die Wartung Ihres Codes erleichtert.
Aufgabe
EinfachLassen Sie uns ein Fahrzeughierarchie-System aufbauen, das demonstriert, wie Vererbung es Kindklassen ermöglicht, Funktionalitäten einer Elternklasse zu teilen und gleichzeitig ihre eigenen spezialisierten Verhaltensweisen 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 nur Motorräder haben.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.
Probier es selbst
<?php
// Binde die Motorcycle-Klasse ein (welche 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