Aufrufen einer überschriebenen übergeordneten Methode

Lesezeit: 4 Minuten

Benutzer-Avatar
kiler129

Im folgenden Beispielcode wird die Methode test() in der Elternklasse Foo wird von der Methode überschrieben test() im Kinderunterricht Bar. Ist es möglich anzurufen Foo::test() aus Bar::test()?

class Foo 
{
  $text = "world\n";

  protected function test() {
    echo $this->text;
  }
}// class Foo

class Bar extends Foo 
{
  public function test() {
    echo "Hello, ";

    // Cannot use 'parent::test()' because, in this case,
    // Foo::test() requires object data from $this
    parent::test();
  }
}// class Bar extends Foo

$x = new Bar;
$x->test();

  • Bitte bearbeiten Sie Ihre Frage, um den Code direkt einzufügen…

    – Oliver Charlesworth

    10. November 2011 um 0:10 Uhr

  • Was meinst du mit foo::test() REQUIRE_DISABLED object data from $this

    – Nickb

    10. November 2011 um 0:11 Uhr

  • @Oli Charlesworth – Ich habe es oft versucht, aber ich kann nicht herausfinden, wie man es richtig macht, deshalb benutze ich Pastebin 🙂

    – Kiler129

    10. November 2011 um 0:13 Uhr

  • Sie können Methoden in PHP nicht überladen, Sie können sie nur überschreiben. Überprüfen Sie die Notizenabschnitte oben: php.net/manual/en/language.oop5.overloading.php

    – Mike Purcell

    10. November 2011 um 0:13 Uhr

  • @kiler129: Wenn Sie parent::method() aus einem Objektkontext verwenden, hat die übergeordnete Methode immer noch Zugriff auf $this.

    – HerrTrick

    10. November 2011 um 0:29 Uhr

Benutzer-Avatar
Adam Zalcman

Verwenden parent:: vor dem Methodennamen, z

parent::test();

Sehen Elternteil

parent::test();

(siehe Beispiel #3 unter http://www.php.net/manual/en/language.oop5.paamayim-nekudotayim.php)

  • Sie haben Recht – die Verwendung von parent:: from child class verweist auf das Objekt und ruft die Objektmethode (nicht die statische Methode) auf. Danke für Hilfe 🙂

    – Kiler129

    10. November 2011 um 0:22 Uhr


Legen Sie einfach die Sichtbarkeitsstufen in der $text-Eigenschaft fest.

private $text = "world\n";

Das Aufrufen einer übergeordneten Methode kann als schlechte Praxis oder Codegeruch angesehen werden und kann auf eine Programmierlogik hinweisen, die so verbessert werden kann, dass das untergeordnete Element das übergeordnete Element nicht aufrufen muss. Eine gute generische Beschreibung liefert Wikipedia.

Eine Implementierung ohne aufrufenden Elternteil würde wie folgt aussehen:

abstract class Foo
{
    $text = "world\n";

    public function test() {
        $this->test_child();
        echo $this->text;
    }

    abstract protected function test_child();
}// class Foo

class Bar extends Foo
{
    protected function test_child() {
        echo "Hello, ";
    }
}// class Bar extends Foo

$x = new Bar;
$x->test();

Nach Ihren Kommentaren zum Pastebin zu urteilen, würde ich sagen, dass Sie das nicht können.

Vielleicht, wenn Sie so etwas hätten?

class foo {
    public function foo($instance = null) {
        if ($instance) {
            // Set state, etc.
        }
        else {
            // Regular object creation
        }
}
class foo2 extends foo {
    public function test() {
        echo "Hello, ";
        // New foo instance, using current (foo2) instance in constructor
        $x = new foo($this);
        // Call test() method from foo
        $x->test();
    }
}

  • Warum übergeben Sie nicht einfach die erforderlichen Parameter von $this zu foo()? (Anstelle des ganzen Dings)

    – Nickb

    10. November 2011 um 0:24 Uhr


  • Er kann auf die übergeordnete Version von test verweisen, indem er parent::test() voranstellt, wie in den anderen Beiträgen erwähnt. Möglicherweise möchten Sie eine Löschung in Betracht ziehen, bevor Sie abgelehnt werden.

    – Mike Purcell

    10. November 2011 um 0:24 Uhr

  • @jeanreis – in meinem Code ist es fast unmöglich, Tricks wie diese oben zu verwenden, bcs-Objekte wiegen manchmal einige Megabyte (es ist eine Server-App, kein klassisches Web-Skript ofc). Tricks wie diese führen zu einer hohen Speicherauslastung.

    – Kiler129

    10. November 2011 um 0:25 Uhr

  • In Bezug auf parent::test() hatte ich den Eindruck, dass die Methode nicht statisch aufgerufen werden kann, daher meine Antwort. Das war nur ein Vorschlag, ohne die Einzelheiten zu kennen, ist es schwer zu sagen, ob es realisierbar ist.

    – Jeanreis

    10. November 2011 um 0:29 Uhr

  • Nun … PHP als [semi]wahr-objektive Sprache ist sehr jung 🙂

    – Kiler129

    10. November 2011 um 0:36 Uhr

  • Warum übergeben Sie nicht einfach die erforderlichen Parameter von $this zu foo()? (Anstelle des ganzen Dings)

    – Nickb

    10. November 2011 um 0:24 Uhr


  • Er kann auf die übergeordnete Version von test verweisen, indem er parent::test() voranstellt, wie in den anderen Beiträgen erwähnt. Möglicherweise möchten Sie eine Löschung in Betracht ziehen, bevor Sie abgelehnt werden.

    – Mike Purcell

    10. November 2011 um 0:24 Uhr

  • @jeanreis – in meinem Code ist es fast unmöglich, Tricks wie diese oben zu verwenden, bcs-Objekte wiegen manchmal einige Megabyte (es ist eine Server-App, kein klassisches Web-Skript ofc). Tricks wie diese führen zu einer hohen Speicherauslastung.

    – Kiler129

    10. November 2011 um 0:25 Uhr

  • In Bezug auf parent::test() hatte ich den Eindruck, dass die Methode nicht statisch aufgerufen werden kann, daher meine Antwort. Das war nur ein Vorschlag, ohne die Einzelheiten zu kennen, ist es schwer zu sagen, ob es realisierbar ist.

    – Jeanreis

    10. November 2011 um 0:29 Uhr

  • Nun … PHP als [semi]wahr-objektive Sprache ist sehr jung 🙂

    – Kiler129

    10. November 2011 um 0:36 Uhr

1145280cookie-checkAufrufen einer überschriebenen übergeordneten Methode

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

Privacy policy