echo $begrüßung;
Es gibt eine Superklasse SK.
Welche Aufgabe hat diese?
Es gibt einige Klassen, die von SK ableiten: UK1, UK2 usw.
Und wozu dienen diese? Hast du mehrere Plugin-Stellen in deinem Programm und jeweils eine UK ist für solch eine Stelle zuständig? Und SK ist eine generische Klasse solch einer Plugin-Stelle?
In SK ist eine statische Methode getPlugins($instance) definiert, die von Instanzen von UK1 usw. aufgerufen wird:
$uk1 = new UK1;
In UK1 im Konstruktor:
$this->getPlugins($this);
Mit -> ruft man Methoden dynamisch auf. Statische Aufrufe gehen über klassenname::methodenname(…). Bei $this->getPlugins($this); handelt es sich um einen dynamischen Aufruf und es ist überflüssig, $this zu übergeben, denn innerhalb von getPlugins zeigt $this auf dein $uk1.
In SK.getPlugins() findet sowohl der include() als auch die Instanzenbildung
Das sind vermutlich die einzelnen Plugins.
$instance->$newInstance = new $class($instance); statt.
Ich nehme an, in $class befindet sich der Klassenname des Plugins. Spricht was dagegen, die UKx à la PluginPlatz zu benennen und für die Plugin-Klassen die Namenskonvention PluginPlatz_IndividuellerName zu verwenden?
Es gibt in SK noch eine andere statische Methode, die zuvor eine Liste mit den vorhandenen Plugins erzeugt. Wie zu sehen, reicht getPlugins() mit new $class($instance) den Zeiger weiter, der sodann in dem Plugin gespeichert wird. $newInstance und $class sind im Prinzip nur bereinigte Namen, vgl. das o. g. Problem mit demselbem Namespace.
Auf die Pluginmethoden läßt sich jetzt mit $uk1->plugin->methode() zugreifen. Im Plugin selbst kann auf Methoden von UK1 zugreifen.
Warum muss ein Plugin auf einen Plugin-Handler zugreifen? Um ein Radio zu beschreiben braucht es keinen Verweis auf den Ort an dem es steht. Für unterschiedliche Typen aber eine Klasse anzulegen, die von einer generischen Radioklasse erbt, ist schon eher sinnvoll. So ein Radio braucht zum Arbeiten Instanzen der Klassen Antenne und Lautsprecher. Die sucht es sich aber nicht selbständig aus seiner Umgebung (wofür es einen Verweis auf die Umgebung übergeben benötigte) sondern bekommt sie als Parameter bei der Inbetriebnahme übergeben.
Schöner wäre es, wenn es nicht nötig wäre, Plugininstanzen mit $instance->$newInstance = new $class($instance); zu bilden, sondern einfach die Pluginklasse als statische Klasse direkt in UK1 einzubinden, um dann von außen mit $uk1->pluginmethode() zugreifen zu können.
Klassen sind während der Laufzeit statische Dinge. Bereits vor dem Kompilieren müssen ihre Beziehungen zueinander feststehen. Auch wenn wie im Falle PHPs Codeteile auch noch zur Laufzeit hinzugefügt werden können, ändert das nichts an ihren feststehenden Beziehungen zueinander.
Wenn jemand ein Plugin schreibt, das auf generische Funktionen zugreifen soll, dann kann man eine Plugin-Elternklasse erstellen, von der dann das Plugin erben kann.
Klassen so zu designen, dass sie viele Dinge von ihrer Umgebung wissen müssen, nach denen sie noch dazu selbständig greifen sollen, ist kein gutes Design. Alles was sie wissen müssen, sollte man ihnen übergeben. Man kann sie besser testen (händisch als auch mit Unit-Tests), wenn man nicht erst eine komplexe Umgebung aufbauen muss. Besser ist es, das Benötigte in Form von Dummys zu übergeben.
echo "$verabschiedung $name";