Aufrufen einer überschriebenen übergeordneten Methode
Lesezeit: 4 Minuten
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 🙂
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
11452800cookie-checkAufrufen einer überschriebenen übergeordneten Methodeyes
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