Mehrere Möglichkeiten zum Aufrufen der übergeordneten Methode in PHP

Lesezeit: 4 Minuten

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;

Mehrere Moglichkeiten zum Aufrufen der ubergeordneten Methode in PHP
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:

  1. 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.

  2. 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 $thismüssen Sie sich keine Gedanken über die Unterscheidung zwischen diesem Fall und dem ersten machen.

  3. 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.

  • wie würde ich es ohne “erweitern” machen? als hätte ich eine Klasse “Bein” in der Klasse “Mensch”, aber ich muss sie nicht wirklich erweitern, da ich die “Mensch”-Funktionalität der Eltern nicht benötige. jetzt, wenn ich eine erstellt habe $leg = new leg() innerhalb der humanwie würde ich die Funktionen des Menschen aus einer Beininstanz aufrufen $leg?

    – Benutzer151496

    24. Mai 2016 um 9:27 Uhr

  • @ user151496 Ein Bein ist keine Unterklasse des Menschen. Ein Mensch hat viele Beine, aber ein Bein ist keine Art von Mensch. Daher sollten Sie keine Beinklasse haben, die vom Menschen erbt, da ein Bein kein Mensch ist.

    – Käfer

    13. September 2016 um 14:20 Uhr

  • Würden Sie Leg zu einer Klasse machen, die eine Schnittstelle von Leggy hat? Oder einfach die Human-Klasse Leggy implementieren lassen? Wie können wir am besten definieren, dass ein Bein nicht nur dem Menschen vorbehalten ist, sondern auch, dass menschliche Beine einzigartig und ein allgemeines Eigentum des Menschen sind?

    – Antonius

    14. September 2016 um 10:01 Uhr

  • paamayim nekudotayim ist etwas verwirrend. Auf den ersten Blick sieht es so aus, als würden Sie eine statische Methode aufrufen. Es hätte stattdessen parent->get_species() sein sollen

    – Peter Chaula

    3. Mai 2018 um 10:04 Uhr


  • Einverstanden. Statische Aufrufe sind in vielerlei Hinsicht sehr verwirrend. Ich sollte das irgendwann aktualisieren.

    – Antonius

    3. Mai 2018 um 10:08 Uhr

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.

  • Das ist ein guter Punkt bei der Verwendung von $this, falls ich die Methode überschreiben möchte. Danke

    – Jerry

    28. Juni 2012 um 3:15 Uhr

1005280cookie-checkMehrere Möglichkeiten zum Aufrufen der übergeordneten Methode in PHP

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy