Moin!
Wenn du mit den Methoden und Eigenschaften von Unterklasse arbeiten willst - wieso erzeugst du dir dann nicht einfach eine Instanz von Unterklasse und arbeitest damit?
Es geht hierbei um ein Modul für ein CMS. In dem CMS werden die Module in einer Klasse zusammengefasst, die Klasse ist die Superklasse in meinem Beispiel. Das CMS lädt also automatisch eine Instanz von dem Modul bzw. der Superklasse.
Mein Modul bringt einige Funktionen die ich in keline Plugins (Unterklassen) auslagern will :) Die Funktionen in den Plugins sollen also in dem Modul zur Verfügung stehen.
Klingt verrückt oder?
Dein Ansatz ist es jedenfalls, weil er ganz viele Dinge tut, die man zwar tun könnte, aber nicht tun sollte.
Lass uns erst mal erörtern, was du da eigentlich als Effekt am Ende haben willst.
class Superklasse {
public static $unterklasse;
function __construct(){
new Unterklasse();
}
function doSomething(){
return self::$unterklasse->irgendwas();
}
}
class Unterklasse extends Superklasse {
function __construct(){
parent::$unterklasse=&$this;
}
function irgendwas(){
return "Hallo Welt";
}
}
$superklasse = new Superklasse();
echo $superklasse->doSomething();
Zunächst mal zu dem, was man nicht tun sollte:
1. Wenn deine Unterklasse in die Superklasse individuelle Funktionalität einbringen soll, dann ist das hier total überflüssig: Unterklasse extends Superklasse. Warum Vererbung?
Ich meine: WENN Vererbung, dann richtig, indem du zur Nutzung nur die Unterklasse instantiierst, und sich damit dein Problem erledigt.
2. Das Erstellen einer explizit benannten Unterklasse im Konstruktor ist ebenfalls nicht schön. Das, was du eigentlich an der Stelle tun willst, was sich in deiner ersten Codeversion auch dargestellt hat, ist das Übergeben der Unterklasse als Parameter im Konstruktor. Sowas nennt man Dependency Injection, und deine gewählte Variante ist davon die einfachste.
Jetzt hast du als Anforderung aber erwähnt, dass es blöd ist, wenn die Superklasse immer noch eine Instanz der Unterklasse mitbekommen muss. Für sowas schreibt man sich dann eine Factory, die die einzelnen Objekte für einen zusammensetzt. Vorteil: Das Instanziieren einer Superklasse integriert halt nicht automatisch immer dieselbe Unterklasse - denn wo wäre da der Vorteil, da kann man die darin befindlichen Methoden ja gleich in der Superklasse integrieren.
Aber um zu wissen, was genau du da jetzt eigentlich tun willst, solltest du noch mehr Details preisgeben, was da eigentlich genau getan werden soll von deinen ganzen Klassen. Es gibt noch deutlich mehr Entwicklungsmuster, die für "irgendwas mit Plugin drin" in Frage kommen, aber mir fehlt halt die Info, wozu du das eigentlich so kompliziert aufziehst.
- Sven Rautenberg