Das parent:: Schlüsselwort
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy — Lektion 22 von 91.
Wenn eine Kindklasse von einer Elternklasse erbt, müssen Sie manchmal direkt auf die Methoden oder Eigenschaften der Elternklasse zugreifen. Das Schlüsselwort parent:: ermöglicht es Ihnen, die Implementierung der Elternklasse aus der Kindklasse heraus aufzurufen.
Dies ist besonders nützlich in Konstruktoren, wenn die Kindklasse die Eigenschaften der Elternklasse initialisieren muss, während sie gleichzeitig ihre eigenen einrichtet:
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
class Dog extends Animal {
public $breed;
public function __construct($name, $breed) {
parent::__construct($name);
$this->breed = $breed;
}
public function describe() {
return "$this->name is a $this->breed";
}
}
$dog = new Dog("Max", "Labrador");
echo $dog->describe();
Ausgabe:
Max is a LabradorDurch den Aufruf von parent::__construct($name) verwendet die Kindklasse die Initialisierungslogik der Elternklasse wieder, anstatt sie zu duplizieren. Ohne diesen Aufruf würde die Eigenschaft $name niemals gesetzt werden.
Sie können parent:: verwenden, um jede Methode der Elternklasse aufzurufen, nicht nur Konstruktoren. Dies ist besonders wichtig, wenn Sie das Verhalten einer Methode erweitern möchten, anstatt es vollständig zu ersetzen.
Wichtiger Punkt: Das Schlüsselwort parent:: bietet eine Möglichkeit, auf die Implementierung der Elternklasse zuzugreifen. Es ist essenziell für ordnungsgemäßes Constructor Chaining und um auf geerbter Funktionalität aufzubauen, anstatt sie neu zu schreiben.
Aufgabe
EinfachLassen Sie uns ein Produktkatalog-System erstellen, das zeigt, wie Kindklassen die Funktionalität von Elternklassen mithilfe des Schlüsselworts parent:: erweitern können, um Konstruktoren ordnungsgemäß zu verketten und auf geerbten Methoden aufzubauen.
Sie werden Ihren Code in drei Dateien organisieren:
Product.php— Definieren Sie eine KlasseProduct, die als Basis für alle Produkte dient. Sie sollte die öffentlichen Eigenschaften$nameund$pricehaben. Der Konstruktor akzeptiert einen Namen und einen Preis und setzt beide Eigenschaften. Fügen Sie eine MethodegetDetails()hinzu, die"[name]: $[price]"zurückgibt.ElectronicProduct.php— Definieren Sie eine KlasseElectronicProduct, dieProducterweitert. Binden Sie die Product-Datei am Anfang ein. Diese Klasse fügt eine Eigenschaft$warranty(in Monaten) hinzu. Der Konstruktor sollte Name, Preis und Garantie akzeptieren — verwenden Sieparent::__construct(), um den Namen und den Preis über die Elternklasse zu initialisieren, und setzen Sie dann die Garantie selbst. Erstellen Sie eine MethodegetDetails(), die auf der Implementierung der Elternklasse aufbaut: Rufen Sieparent::getDetails()auf und hängen Sie" (Warranty: [warranty] months)"an.main.php— Binden Sie die ElectronicProduct-Datei ein. Sie erhalten drei Eingaben: den Produktnamen, den Preis (als String, der in einen Float umgewandelt werden soll) und den Garantiezeitraum (als String, der in einen Integer umgewandelt werden soll). Erstellen Sie einElectronicProductmit diesen Werten und geben Sie das Ergebnis des Aufrufs vongetDetails()aus.
Diese Herausforderung zeigt die wahre Stärke von parent:: — nicht nur für die Verkettung von Konstruktoren, sondern auch für die Erweiterung des Methodenverhaltens. Ihr ElectronicProduct verwendet die Formatierungslogik der Elternklasse wieder und fügt eigene Details hinzu, wodurch Codeduplizierung vermieden und eine detailliertere Ausgabe erstellt wird.
Spickzettel
Das Schlüsselwort parent:: ermöglicht es einer untergeordneten Klasse, auf Methoden und Eigenschaften ihrer übergeordneten Klasse zuzugreifen.
Verwenden Sie parent::__construct(), um den Konstruktor der übergeordneten Klasse aus der untergeordneten Klasse aufzurufen:
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
class Dog extends Animal {
public $breed;
public function __construct($name, $breed) {
parent::__construct($name);
$this->breed = $breed;
}
}
Sie können parent:: auch verwenden, um eine beliebige Methode der übergeordneten Klasse aufzurufen und deren Verhalten zu erweitern:
<?php
class Animal {
public function describe() {
return "This is an animal";
}
}
class Dog extends Animal {
public function describe() {
return parent::describe() . " and it's a dog";
}
}
Dieser Ansatz ermöglicht es untergeordneten Klassen, die Logik der übergeordneten Klasse wiederzuverwenden, anstatt Code zu duplizieren, was eine korrekte Konstruktor-Verkettung und Methodenerweiterung ermöglicht.
Probier es selbst
<?php
require_once 'ElectronicProduct.php';
// Eingaben lesen
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$warranty = intval(trim(fgets(STDIN)));
// TODO: Erstellen Sie ein ElectronicProduct mit den Eingabewerten
// und geben Sie das Ergebnis des Aufrufs von getDetails() 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