Zuerst war ich verwirrt, warum beide Methodenaufrufe im Konstruktor funktionieren, aber jetzt glaube ich, ich verstehe. Die erweiternden Klassen erben die Methoden der übergeordneten Klasse, als ob sie in der Klasse selbst deklariert wären UND die Methoden in der übergeordneten Klasse vorhanden sind, sodass beide funktionieren sollten.
Jetzt frage ich mich, ob es einen bevorzugten Weg (dh Best Practice) gibt, die Methode aufzurufen (via parent
oder this
) und ob dies wirklich identische Methoden zum Ausführen des gleichen Codes sind oder ob es irgendwelche Einschränkungen gibt, wenn man sie übereinander verwendet.
Tut mir leid, ich mache mir wahrscheinlich zu viele Gedanken.
abstract class Animal {
function get_species() {
echo "test";
}
}
class Dog extends Animal {
function __construct(){
$this->get_species();
parent::get_species();
}
}
$spike = new Dog;

Antonius
Es gibt drei Szenarien (die ich mir vorstellen kann), in denen Sie eine Methode in einer Unterklasse aufrufen würden, in der die Methode in der übergeordneten Klasse beendet wird:
-
Die Methode wird nicht von der Unterklasse überschrieben, existiert nur in der übergeordneten Klasse.
Dies ist dasselbe wie in Ihrem Beispiel und im Allgemeinen ist es besser zu verwenden $this -> get_species();
Sie haben Recht, dass die beiden in diesem Fall praktisch gleich sind, aber die Methode wurde von der Unterklasse geerbt, sodass es keinen Grund zur Unterscheidung gibt. Durch die Nutzung $this
Sie bleiben konsistent zwischen geerbten Methoden und lokal deklarierten Methoden.
-
Die Methode wird von der Unterklasse überschrieben und hat eine völlig eindeutige Logik der übergeordneten Klasse.
In diesem Fall möchten Sie natürlich verwenden $this -> get_species();
weil Sie nicht wollen, dass die Elternversion der Methode ausgeführt wird. Wieder durch konsequente Anwendung $this
müssen Sie sich keine Gedanken über die Unterscheidung zwischen diesem Fall und dem ersten machen.
-
Die Methode erweitert die Elternklasse und fügt zu dem hinzu, was die Elternmethode erreicht.
In diesem Fall möchten Sie immer noch verwenden `$this -> get_species();
beim Aufruf der Methode aus anderen Methoden der Unterklasse. Die einzige Stelle, an der Sie die übergeordnete Methode aufrufen, wäre die Methode, die die übergeordnete Methode überschreibt. Beispiel:
abstract class Animal {
function get_species() {
echo "I am an animal.";
}
}
class Dog extends Animal {
function __construct(){
$this->get_species();
}
function get_species(){
parent::get_species();
echo "More specifically, I am a dog.";
}
}
Das einzige Szenario, das ich mir vorstellen kann, in dem Sie die übergeordnete Methode direkt außerhalb der überschreibenden Methode aufrufen müssten, wäre, wenn sie zwei verschiedene Dinge tun würden und Sie wüssten, dass Sie die übergeordnete Version der Methode benötigen, nicht die lokale. Dies sollte nicht der Fall sein, aber wenn es sich ergeben würde, wäre die saubere Herangehensweise, eine neue Methode mit einem Namen wie zu erstellen get_parentSpecies()
wo es nur die übergeordnete Methode aufruft:
function get_parentSpecies(){
parent::get_species();
}
Auch hier bleibt alles schön und konsistent und ermöglicht Änderungen/Modifikationen an der lokalen Methode, anstatt sich auf die übergeordnete Methode zu verlassen.
Wenn ich die Frage nicht falsch verstehe, würde ich fast immer $this->get_species verwenden, da die Unterklasse (in diesem Fall Hund) diese Methode überschreiben könnte, da sie sie erweitert. Wenn die Klasse dog die Methode nicht neu definiert, sind beide Möglichkeiten funktional gleichwertig, aber wenn Sie irgendwann in der Zukunft entscheiden, dass die get_species-Methode in dog “dog” ausgeben soll, müssten Sie den gesamten Code und zurückgehen ändern Sie es.
Wenn Sie $this verwenden, ist es tatsächlich Teil des Objekts, das Sie erstellt haben, und ist daher auch immer das aktuellste (wenn sich die verwendete Eigenschaft während der Lebensdauer des Objekts irgendwie geändert hat), während Sie die übergeordnete Klasse verwenden ruft die statische Klassenmethode auf.
10052800cookie-checkMehrere Möglichkeiten zum Aufrufen der übergeordneten Methode in PHPyes