sven_peters: In nested class auf übergeordnete Klasse zugreifen

Beitrag lesen

Hallo!

In deinem speziellen Fall hast du genau eine Referenz auf ein Objekt der Klasse B in der Eigenschaft a eines Objekts der Klasse A abgelegt. Es kann aber beliebig viele Referenzen auf diese B-Objekt geben. Herauszufinden, welche Variablen (globale und lokale, inklusive Array-Elementen und Objekteigenschaften) eine Referenzen auf einen bestimmten Variablen-Container darstellen, ist in PHP nicht vorgesehen und sicher auch nicht zu 100% selbst zu erstellen.

Das dachte ich mir.

Ich muß etwas ausholen, könnte aber etwas kompliziert werden. Es geht um ein Pluginsystem. Mehrere Klassen erben von einer Superklasse. In dieser Superklasse ist eine statische Methode definiert, die automatisch aus einem Pluginverzeichnis Plugins ausliest und Unterklassen in die Unterklassen der Superklasse ablegt. Leider habe ich keine Möglichkeit gefunden, Klassen in andere Klassen statisch einzubinden, deswegen werden die Pluginklassen als (Array-)Instanzen in den Unterklassen "inkludiert". Die statische Inkludierungsmethode bekommt den jeweiligen Zeiger der aufrufenden Unterklasse der Superklasse übergeben. Ich habe das jetzt so erweitert, daß diese Methode den Zeiger an die Pluginklasse weiterreicht, wo er als private Eigenschaft $parent abgelegt wird. Somit kann ich zwar jetzt, ohne auf $GLOBALS zurückgreifen zu müssen, relativ frei Instanzen der Unterklassen der Superklasse bilden und in den Pluginklassen auf deren Methoden zugreifen, aber der Weg ist ziemlich vertrackt und nicht gerade wartungsfreundlich.

Erschwerend kommt noch hinzu, daß es mir absolut nicht möglich ist, die Pluginklassen gleich zu benennen. Wenn ich ein Plugin info habe und für drei Unterklassen denselben Klassennamen Info verwenden will, meckert der PHP-Interpreter, er könne sie nicht redeklarieren. Es ist also nicht eine Kapselung UK1.Info, UK2.Info, UK3.Info usw. möglich, weil die Klassen Info allesamt dem globalen Namensraum angehören. Ich habe mir so beholfen. die drei Pluginklassen UK1_Info, UK2_Info usw. zu benennen, und im Array werden sie trotzdem als UK1.plugin['Info'] benannt, aber das ist aus Sicht der OOP ziemlich schräg.

Dewegen frage ich noch mal: Ist es tatsächlich nicht möglich, Klassen statisch in andere Klassen einzubinden, ähnlich einer Closure?

Ich hoffe, ich habe das einigermaßen nachvollziehbar beschrieben.