PHP Autoloader Eigenschaften
Namespaces
Seit PHP 5.3 gibt es Namespaces. Der Autoloader unterstützt Namespaces vollständig. Auch wenn mehrer Namespaces in einer Datei verwendet werden, findet der Autoloader die Klassen mit ihrem jeweiligen Namespace. Für den Autoloader spielt es keine Rolle ob die geklammerte Syntax oder die einfache Syntax verwendet wird.
Indexbasierte Klassensuche
Zum schnellen finden einer einmal gefundenen Klassendefinition pflegt der Autoloader einen Index. Der Index wird automatisch aktualisiert wenn eine Klassendefinition entfernt, verschoben oder neu hinzugekommen ist. Folgende Indexstrukturen werden unterstützt:
- AutoloaderIndex_SerializedHashtable_GZ Komprimierte serialisierte Hashtabelle (Standard)
- AutoloaderIndex_SerializedHashtable Serialisierte Hashtabelle
- AutoloaderIndex_PDO PDO
- AutoloaderIndex_IniFile Hashtabelle aus einer Konfigurationsdatei
- AutoloaderIndex_CSV Hashtabelle aus einer CSV-Datei
- AutoloaderIndex_PHPArrayCode Hashtabelle als PHP-Code - Diese Implementierung ist für Testzwecke gedacht. Sie sollte wegen der potentiellen Gefahr Fremdcode auszuführen nicht produktiv zum Einsatz kommen.
Optimierte Dateisuche
Wenn eine Klassendefinition noch nicht im Index hinterlegt ist muss das Dateisystem einmalig nach der Definition durchsucht werden. Dabei werden Dateien, die dem Klassennamen ähneln und mit den Endungen .php und .inc enden bevorzugt. Es werden selbstverständlich auch alle anderen Dateien nach der Klassendefinition durchsucht. Allerdings geschieht dies erst nach den potentiellen Kandidaten.
Klassenkonstruktor
Nach dem Einbinden der Klassendefinition wird falls vorhanden der
Klassenkonstruktor
__static()
classConstructor() aufgerufen. PHP
selbst kennt keinen Klassenkonstruktor. Ein Klassenkonstruktor wird anders
als der Objektkonstruktor __construct() nur einmalig für eine
Klasse aufgerufen. Er befindet sich mit der Definition public static
function classConstructor() im statischen
Klassenkontext. Dies kann z.B. nützlich sein um Klassenattribute zu
initialisieren:
<?php
class Singleton
{
/**
* @var Singleton
*/
private static $_instance;
public static function classConstructor()
{
self::$_instance = new self();
}
/**
* @return Singleton
*/
public static function getInstance()
{
return self::$_instance;
}
private function __construct()
{
}
private function __clone()
{
}
}
Mehrfachverwendung
Es können mehrere Autoloader gleichzeitig benutzt werden. Der Autoloader berücksichtigt die Existenz anderer Autoloader. Dabei spielt es keine Rolle ob es fremde Autoloader, dieser Autoloader oder gar dieser Autoloader aus einer anderen Stelle im Dateisystem ist. Es wäre z.B. denkbar, dass eine Komponente eines Drittanbieters mit diesem Autoloader ausgeliefert wurde und somit doppelt deklariert würde. Bevor der Autoloader seine eigenen Klassen definiert, vergewissert er sich, dass sie nicht schon existieren.