Nun wie angekündigt die Fortsetzung des letzten Beitrags, bei dem es um die richtige Verwendung von include(_once) und require(_once) ging. Eine weitere Methode zum Laden von Code, speziell zum Laden vom Klassen, ist die Verwendung eines (oder mehrerer) Autoloader. Dieser Mechanismus existiert seit PHP 5 und lädt Klassendefinition bei Bedarf automatisch.
Hierzu kann prinzipiell auf zwei Methoden zurückgegriffen werden, __autoload() und spl_autoload_register(). Der wesentliche Unterschied liegt darin, dass __autoload() nur einmal implementiert werden kann, wohingegen durch spl_autoload_register() beliebig viele Autoloader registriert werden können. Demnach wird ausdrücklich die Verwendung von spl_autoload_register() empfohlen. Ein Autoloader in PHP arbeitet in den inkludierten Verzeichnissen (include_path), welche nach der benötigten Klassendefinition durchsucht werden. Das Arbeiten mit einem Autoloader ist gerade auch deshalb sehr komfortabel, da die Klassendateien problemlos verschoben werden können. Eine separate Hinterlegung der Klassendatei in den ausführenden Dateien durch include(_once) oder require(_once) entfällt ebenfalls.
Zur Einbindung eines einfachen Autoloaders sind demzufolge drei Schritte notwendig:
- Registrierten des Klassenverzeichnisse
- Implementierung des Autoloaders
- Registrierung des Autoloaders
Im Folgenden ein kleines Beispiel, wie soetwas konkret aussehen könnte.
// Registrierung des/der Klassenverzeichnisse set_include_path(get_include_path() . PATH_SEPARATOR . "classes"); // Implementierung des Autoloaders class Autoloader { public static function load($classname) { include $classname.".php"; } } // Registrierung des Autoloaders spl_autoload_register('Autoloader::load');
Diese Implementierung sorgt dafür, dass wenn eine Klassendefinition benötigt wird, diese anhand des Klassennamen nachgeladen wird. Die Konvention ist also dass der Name der Datei Klassenname.php ist.
Zusammenfassend lässt sich festhalten, dass es sich beim Autoloader um eine äußerst praktikable Technik handelt, mit der man sich als Entwickler viel Arbeit und Ärger ersparen kann.
Wie man die Verzeichnisstruktur aufbaut kann man sich im PSR-0 abschauen. Voraussetzung ist dann aber auch, dass die mit PHP 5.3 eingeführten Namespaces Verwendung finden.
http://groups.google.com/group/php-standards/web/psr-0-final-proposal
Die Einführung der Namespaces in PHP finde ich sowieso ein tolle Sache. Weitere Informationen dazu sind übrigens im PHP-Manual zu finden:
http://php.net/manual/de/language.namespaces.php