parent-parent

thomy800

Erfahrenes Mitglied
Hi

Ich habe mich gefragt, ob es möglich ist auf parents parent-Funktionen zuzugreifen. Am besten ich erkläre es mal an nem Beispiel:
PHP:
class a {
	function abc() {
		//macht was
	}
}
class b extends a{
	//überschreibe abc
	function abc() {
		//macht was neues
		parrent::abc();
	}
}
class c extends b{
	//überschreibe abc
	function abc() {
		//soll wieder funktion von class a aufrufen
		//sozusagen: parent::parent::abc();
	}
}
Die Frage, warum nicht gleich class c extends a lassen wir mal bei Seite, das macht aus anderen Gründen Sinn^^
Also die Frage: ist für solch einen Fall eine Möglichkeit vorgesehen oder muss ich das mit zusätzlichen Funktionen lösen?

MfG thomy
 
Hmm

PHP:
<?php
class a
{
    public function abc()
    {
        echo "Hello from a<br/>";
    }
}

class b extends a
{
    public function abc()
    {
        parent::abc();

        echo "Hello from b<br/>";
    }
}

class c extends b
{
    public function abc()
    {
        parent::abc();

        echo "Hello from c<br/>";
    }
}

$obj = new c();
$obj->abc();
?>

Gibt aus:

Code:
Hello from a
Hello from b
Hello from c
 
Hm.. da hast du mich missverstanden. Gemeint war, dass class c bei Aufruf exackt die Funktion von class a ausführt.
Mitlerweile habe ich selber schon eine Möglichkeit entwickelt. Ich habe die Abhängigkeiten der Klassen etwas geändert und jetzt funktioniert das so, wie ich es mir gedacht habe. (So habe ich diese Situation umgangen.)
Trotzdem danke :)

mfg thomy
 
Hi,

ja, da hast du recht, das ich dich falsch verstanden habe. Ich habe immer noch nicht verstanden, was an meinem Beispiel nicht passt. C ruft A über den "Umweg" B auf. Man könnte rein theoretisch in B noch abfragen, ob self eine Instanz von C ist und dementsprechend reagieren. Mehr sollte aber auch nicht notwendig sein. Wenn man von C auf Code von A zugreifen will, muss C von A ableiten. So ist die Regel. Multiple Vererbungen gibts in PHP (noch) nicht.
 
Ja, wie gesagt, ich hatte meine Struktur falsch aufgebaut, also dass die falsche Klasse von der falschen abhängig war. Daher brauchte ich wieder die original-Funktion die ich vorher überschrieben hatte.

Meinst du mit multibler Vererbung:
PHP:
class a extends b,c,d...
?
 
Zuletzt bearbeitet:
Man könnte rein theoretisch in B noch abfragen, ob self eine Instanz von C ist und dementsprechend reagieren.
Das ist meiner Meinung nach wenig sinnvoll, denn dadurch hat Klasse B eine Abhaengigkeit zur Kind-Klasse C.
Meiner Meinung nach sollten Abhaengigkeiten nur von Kindern zu den Eltern, also von der erbenden zur vererbenden Klasse bestehen. Andersrum hebelt es meiner Meinung nach etwas die Vorteile von OOP aus.

Meinst du mit multibler Vererbung:
PHP:
class a extends b,c,d...
?
PHP kennt, wenn sich nichts geaendert hat, keine multiple Vererbung.
Als ich an meiner Klasse MultiSQL gearbeitet hab hab ich mal damit rumprobiert da ich die einzelnen Datenbank-Methoden gern in einzelne Klassen gepackt haette und MultiSQL haette dann lediglich von all diesen Klassen geerbt. Aber wie gesagt, das ging leider nicht.

Uebrigens, um nochwas zu meinem Kommentar zu saftmeisters Beitrag hinzuzufuegen.
Genauso wie eine Abhaengigkeit von der Elternklasse zur Kindklasse wenig Sinn macht ist parent::parent::... wenig sinnvoll. Mal ganz davon abgesehen dass man dabei einen Panama-Jim kriegt (syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM). ;)
Warum das wenig sinnvoll ist sollte auf der Hand liegen. Eine Klasse erbt von ihrer Elternklasse, kann aber nicht wissen wie weit unten in der Hierarchie sie wirklich ist. Die einzige Referenz nach oben ist die Elternklasse.
 
Als ich an meiner Klasse MultiSQL gearbeitet hab hab ich mal damit rumprobiert da ich die einzelnen Datenbank-Methoden gern in einzelne Klassen gepackt haette und MultiSQL haette dann lediglich von all diesen Klassen geerbt. Aber wie gesagt, das ging leider nicht.

Das könnte man in PHP 5.3 emulieren, da es dort dann auch __callStatic gibt usw.
Der Konstruktor nimmt verschiedene Objekte auf, packt die in ein Array und die magischen Methoden laufen dadrüber und schauen nach der Funktion.
 
Vielleicht habe ich es überlesen aber

PHP:
class C extends B
{
    public function abc()
    {
        A::abc();

        echo "Hello from c<br/>";
    }
}

sollte doch das Problem lösen!

Klassennamen bitte groß schreiben ;)
 
Zurück