Autoloader

Zend Framework: Zend_Loader_Autoloader

Seit der Version 1.8.0 gibt es im Zend Framework die Komponente Zend_Loader_Autoloader. Diese verwendet zunächst auch die SPL, um eine interne Ausgangsfunktion als Autoloader zu registrieren. Im Unterschied zur älteren Loader-Komponente werden nun aber weitere Autoloader nicht mehr als SPL-Autoloader registriert und es werden eine Art Namespaces unterstützt, wodurch es möglich ist Autoloader zu registrieren, die nur für bestimmte Namespaces gelten. Zend_Loader_Autoloader implementiert außerdem das Singleton-Pattern.

// Die Instanz von Zend_Loader_Autoloader abrufen
$autoloader = Zend_Loader_Autoloader::getInstance();

Neue Autoloader können registriert werden, indem die Methode pushAutoloader() oder unshiftAutoloader() aufgerufen wird. Erstere fügt den Autoloader an das Ende, zweitere an den Anfang, der Autoloader-Liste an. Diesen Methoden können Objekte von Zend_Loader_Autoloader_Interface, Bezeichner von Callback-Funktionen, oder Arrays übergeben werden. Wird ein Array übergeben, muss dieses zwei Elemente haben: den Namen einer Klasse und den Namen einer statischen Methode dieser Klasse.

Für Arrays existiert ein Beispiel in der offiziellen Dokumentation dieser Komponente:
Man könnte, als Beispiel, ein oder mehrere eZcomponents Komponenten mit der eigenen Zend Framework Anwendung verwenden wollen. Um deren Autoloading Möglichkeiten zu verwenden, müssen diese auf den Autoloader Stack gepusht werden indem man pushAutoloader() verwendet:

$autoloader->pushAutoloader(array('ezcBase', 'autoload'), 'ezc');

Neben dem eigentlichen Autoloader wird diesen Methoden außerdem ein Namespace übergeben, für den der jeweilige Autoloader registriert wird. Der Autoloader wird dann nur bei Klassen aufgerufen, die mit der entsprechenden Zeichenkette beginnen.

$autoloader = 
  Zend_Loader_Autoloader::getInstance()
    ->registerAutoloader('MyAutoloader', 'DevDesk_');

Dieser Autoloader würde für die Klasse DevDesk_Foo gelten, nicht aber für DevTable_Bar und dementsprechend bei Anforderung der zweiten Klasse nicht aufgerufen werden.

Neben den vom Entwickler registrierten Autoloadern gibt es einen Default-Autoloader, der immer registriert ist und der den Schluss der Liste von Autoloadern bildet. Von Haus aus ist dies der, den das Zend_Framework durch Zend_Loader mitbringt. Seinen eigenen Default-Autoloader kann man registrieren, indem man ihn Zend_Loader_Autoloader über dessen Methode setDefaultAutoloader() mitteilt.
Der Default-Autoloader kann ein bereits vorher registrierter Autoloader sein, allerdings macht das nicht viel Sinn, weil diese Methode/Funktion dann zwei Mal aufgerufen würde, sollte sie für den angeforderten Namespace registriert sein und beim vorherigen Aufruf keinen Erfolg gehabt haben.
Wie bei anderen Autoloadern spielen Namespaces auch beim Default-Autoloader eine Rolle. Namespaces, für den der Autoloader gelten soll, werden über registerNamespace() gemeldet. Standardmäßig sind bereits die Namespaces "Zend_" und "ZendX_" registriert.

$autoloader = 
  Zend_Loader_Autoloader::getInstance()
    ->registerNamespace('DevDesk')
    ->setDefaultAutoloader('MyDefaultAutoloader');

Sollen gar keine Namespaces zum Tragen kommen, ist es auch möglich, diese Funktionalität durch den Aufruf von setFallbackAutoloader(false) einfach abzuschalten. Es werden dann grundsätzlich alle registrierten Autoloader in der definierten Reihelfolge abgearbeitet, bis ein Erfolg verzeichnet wird - dies trifft auch auf den Default-Autoloader zu.

$autoloader = Zend_Loader_Autoloader::getInstance()->setFallbackAutoloader(false);
Annika , 03.08.2010 um 19:18

php autoload autoloader