Tach!
public function load ($str) {
if(!isset(self::$loaded_plugins[$str])) {
$class = 'plugin_'.$str;
self::$loaded_plugins[$str] = new $class();
}
}
}
Du hast hier bereits eine Prüfung auf Vorhandensein der Klasse eingebaut. Nur kommt diese bei deinem zirkulären Bezug nicht zum Einsatz. Erst wird die Konstruktorfunktion ausgeführt, die ruft load() auf, woraufhin die Konstruktorfunktion ... Eine Lösung kann sein, erst das Objekt zu erzeugen und in den loaded_plugins ablegen, dann load() aufrufen. Die Konstruktoren dürfen dann aber keinerlei Funktionalität der noch nicht geladenen anderen Plugins verwenden.
Nach dem Clean-Code-Grundsatz "Don't look for things!" wäre jedoch eine andere Vorgehensweise besser. Wenn es Abhängigkeiten gibt, fordert sie das Plugin über Pflichtparameter ein. Das heißt, der Verwender hat dafür zu sorgen, dass alles benötigte erstellt und übergeben wird. Dann kann solch eine Rekursion nicht entstehen, weil er schon beim Code erstellen feststellt, dass er das so nicht hinbekommt. Das Übergabe-Prinzip hört auf den Namen Dependency Injection (DI). Wenn du allerdings ein DI-Frameworks mit automatischer Abhängigkeitsauflösung einzusetzen gedenkst, kann das Problem wieder auftreten, denn dann rennt der Auflösungsmechanismus in die Schleife rein, wenn er ungünstig implementiert ist.
dedlfix.