Sven Rautenberg: include_path und __autoload gemeinsam nutzen

Beitrag lesen

Moin!

ist eine einfache, vielleicht auch blöde Frage. Funktioniert dies? Quasi, daß entweder zuerst die Pfade vom Include-Path abgeklappert werden und, wenn nix gefunden wird, __autoload greift bzw. umgekehrt, daß man, wenn nichts in Verzeichnissen, die von __autoload berücksichtigt werdeb, findet, an den Parser und include_path zurückdeligiert? Ich denke ja nicht, daß es geht, aber vielleicht gibt es ja doch etwas ähnliches!? Bitte keine Antworten wie "erweitere doch den include_path und verzichte auf __autoload". Das weiß ich auch selbst, daß das eine Möglichkeit ist, ich brauche aber was anderes.

Im Grunde solltest du auf __autoload wirklich verzichten, denn damit kannst du nur genau eine Autoload-Routine einbinden. Es gibt mit spl_autoload_register() eine deutlich schönere Methode, Autoload-Funktionen einzubinden, genauer gesagt hintereinanderzuhängen.

Außerdem bietet eigentlich jedes vernünftige PHP-Framework einen Mechanismus an, einen eigenen Autoloader zu benutzen, der die Möglichkeiten von spl_autoload oft noch mal deutlich erweitert. Im Falle des Zend-Frameworks wäre das Zend_Loader_Autoloader.

Um den maximalen Vorteil aus dem Autoloading zu ziehen, sollte man auf jegliches include/include_once bzw. require/require_once verzichten, so dass wirklich nur diejenigen Klassen inkludiert werden, die der ausgeführte Code tatsächlich benutzt. Das setzt allerdings voraus, dass man sich hinsichtlich der Aufteilung von Klassen in Dateien an eindeutige und schlichte Regeln hält, die man seiner Autoload-Routine beibringen muss - oder man nutzt die vorgefertigten Art und Weise des Framework-Autoloaders, den man einsetzt. Üblich ist: Eine Klasse pro Datei, und der Klassenname ist, wenn man Unterstriche in Slashes umsetzt, der Pfadname zur jeweiligen Datei, ausgehend von einem zu definierenden Startverzeichnis (welches sich freundlicherweise nicht im DOCUMENT_ROOT befinden muss).

Abgesehen davon kann man den include_path jederzeit mit ini_set() oder set_include_path() erweitern (zum Lesezugriff ini_get oder get_include_path()), ohne explizit irgendwelche Settings extern aufbohren lassen zu müssen.

- Sven Rautenberg