Der Autoloader
Zend_Loader_Autoloader ist eine vollständige Autoloader Lösung für
den Zend Framework. Sie wurde entwickelt um verschiedene Ziele zu lösen:
Einen echten Namespace Autoloader bieten. (Frühere Inkarnationen waren mit
Namespaces auf Benutzerebene verknüpft)
Es zu erlauben eigene Callbacks als Autoloader zu registrieren und diese als Stack
zu managen. (Zu der als das geschrieben wirde gab es einige Probleme mit
spl_autoload, welche es nicht erlaubten einen Callback erneut zu
registrieren wenn dieser eine Instanzmethode verwendet.)
Er zu erlauben Namespaces optimiert zu matchen um schnellere Auflösung der Klasse
zu erlauben.
Zend_Loader_Autoloader implementiert ein Singleton, was es universell
verwendbar macht. Das bietet die Möglichkeit zusätzlich Autoloader von überall im eigenen
Code zu registrieren wo es notwendig ist.
Verwenden des Autoloaders
Das erste Mal wenn eine Instanz des Autoloaders empfangen wird, registriert dieser sich
mit spl_autoload. Man kann eine Instanz erhalten indem die
getInstance() Methode verwendet wird:
Standardmäßig ist der Autloader so konfiguriert das er den "Zend_" und "ZendX_"
Namespaces entspricht. Wenn man seinen eigenen Bibliothekscode hat der seinen eigenen
Namespace verwendet, kann man Ihn mit dem Autoloader registrieren indem die
registerNamespace() Methode verwendet. Wenn der eigene Blbliothekscode
ein Präfix von "My_" hat, könnte man auch folgendes tun:
registerNamespace('My_');
]]>
Namespace Präfixe
Man sollte beachten das das vorhergehende Beispiel "My_" verwendet und nicht "My".
Der Grund ist, das Zend_Loader_Autoloader als Autoloader für
generelle Anwendungsfälle gedacht ist, und deshalb nicht die Annahme macht das ein
angegebener Präfix eines Klassen Namespaces einen Unterstrich enthalten muß. Wenn
der eigene Klassennamespace einen enhält, dann sollte man Ihn
mit dem eigenen Namespace registrieren.
Man kann auch einen eigene Autoloader Callbacks registrieren, optional mit einem
spezifischen Namespace (oder einer Gruppe von Namespaces).
Zend_Loader_Autoloader versucht zuerst die passenden zu finden
bevor sein interner Autoloading Mechanismus verwendet wird.
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:
pushAutoloader(array('ezcBase', 'autoload'), 'ezc');
]]>
Das zeigt dem Autoloader das der eZcomponents Autoloader für Klassen zu verwenden ist
die mit "ezc" anfangen.
Man kann die unshiftAutoloader() Methode verwenden um den Autoloader
an den Anfang der Autoloader Kette hinzu zu fügen.
Standmäßig, macht Zend_Loader_Autoloader keine
Fehlerunterdrückung wenn sein interner Autoloader verwendet wird, der seinerseits
Zend_Loader::loadClass() verwendet. Die meiste Zeit ist das genau
das was man will. Trotzdem, gibt es Fälle in denen man Sie unterdrücken will.
Man das mit Hilfe von suppressNotFoundWarnings() tun:
suppressNotFoundWarnings(true);
]]>
Letztendlich kann es Zeiten geben in denen man will das der Autoloader irgendeinen
Namespace verwendet. Zum Beispiel verwenden die PEAR Bibliotheken keinen gemeinsamen
Namespace, was es schwierig macht individuelle Namespaces zu spezifizieren wenn viele
PEAR Komponenten verwendet werden. Man kann die setFallbackAutoloader()
Methode verwenden damit der Autoloader als catch-all arbeitet:
setFallbackAutoloader(true);
]]>
Das Autoloader Interface
Neben der Möglichkeit eigene Callbacks als Autoloader zu spezifizieren, definiert
Zend Framework auch ein Interface für Autoloading Klassen,
Zend_Loader_Autoloader_Interface, das implementiert werden kann:
Wenn das Interface verwendet wird, kann man einfach eine Klasseninstanz an
Zend_Loader_Autoloader's pushAutoloader() und
unshiftAutoloader() Methoden übergeben:
pushAutoloader($foo, 'Foo_');
]]>
Autoloader Referenz
Anbei kann ein Wegweiser für die Methoden gefunden werden die in
Zend_Loader_Autoloader vorhanden sind.
Zend_Loader_Autoloader Methoden
Methode
Rückgabewert
Parameter
Beschreibung
getInstance()
Zend_Loader_Autoloader
N/A
empfängt die Singleton Instanz von
Zend_Loader_Autoloader. Beim ersten Empfang
registriert sich diese selbst bei spl_autoload. Diese
Methode ist statisch.
resetInstance()
void
N/A
Resetiert den Status der Singleton Instanz von
Zend_Loader_Autoloader zu dem originalen Status,
de-registriert alle Autoloader Callbacks und alle registrierten
Namespaces.
autoload($class)
string|false
$class, Benötigt.
Der String eines Klassennamens der geladen werden soll.
Versucht einen Klassennamen zu einer Datei aufzulösen und diese zu
laden.
setDefaultAutoloader($callback)
Zend_Loader_Autoloader
$callback, Benötigt.
Spezifiziert einen alternativen PHP Callback der für die standardmäßige
Autoloader Implementation verwendet werden soll.
getDefaultAutoloader()
callback
N/A
Empfängt die standardmäßige Autoloader Implementation; standardmäßig
ist das Zend_Loader::loadClass().
setAutoloaders(array $autoloaders)
Zend_Loader_Autoloader
$autoloaders, Benötigt.
Setzt eine Liste von konkreten Autoloadern für deren Verwendung in den
Autoloader Stack. Jedes Element im Autoloader Array muß ein PHP
Callback sein.
getAutoloaders()
Array
N/A
Empfängt den internen Autoloader Stack.
getNamespaceAutoloaders($namespace)
Array
$namespace, Benötigt
Holt alle Autoloader die registriert wurden um mit einem spezifischen
Namespace geladen zu werden.
registerNamespace($namespace)
Zend_Loader_Autoloader
$namespace, Benötigt.
Registriert ein oder mehrere Namespaces mit dem standardmäßigen
Autoloader. Wenn $namespace ein String ist, registriert
er diesen Namespace; wenn er ein Array von Strings ist, registriert er
jeden als Namespace.
unregisterNamespace($namespace)
Zend_Loader_Autoloader
$namespace, Benötigt.
De-Registriert ein oder mehrere Namespaces vom standardmäßigen
Autoloader. Wenn $namespace ein String ist, de-registriert
er diesen Namespace; wenn er ein Array von Strings ist, de-registriert
er jeden davon als Namespace.
getRegisteredNamespace()
Array
N/A
Gibt ein Array aller Namespaces zurück die mit dem standardmäßigen
Autoloader registriert sind.
suppressNotFoundWarnings($flag = null)
boolean|Zend_Loader_Autoloader
$flag, Optional.
Setzt oder Empfängt den Wert des Flags das verwendet wird um anzuzeigen
ob die standardmäßige Autoloader Implementation "file not found"
Warnungen unterdrücken soll oder nicht. Wenn keine Argumente oder ein
null Wert übergeben wird, wird ein Boolscher Wert zurückgegeben der den
Status des Flags anzeigt; wenn ein Boolean übergeben wurde, wird das
Flag auf den Wert gesetzt und die Autoloader Instanz wird zurückgegeben
(um die Verkettung von Methoden zu erlauben).
setFallbackAutoloader($flag)
Zend_Loader_Autoloader
$flag, Benötigt.
Setzt den Wert des Flags das verwendet wird um anzuzeigen ob der
standardmäßige Autoloader als Fallback, oder Catch-All Autoloader
für alle Namespaces verwendet werden soll.
isFallbackAutoloader()
Boolean
N/A
Empfängt den Wert des Flags das verwendet wird um anzuzeigen ob der
standardmäßige Autoloader als Fallback, oder Catch-All Autoloader
für alle Namespaces verwendet wird. Standardmäßig ist er false.
getClassAutoloaders($class)
Array
$class, Benötigt.
Gibt eine Liste von Namespaced Autoloadern zurück die der angegebenen
Klasse potentiell entsprechen. Wenn keine passt, werden alle globalen
(nicht ge-namespaceten Autoloader) zurückgegeben.
unshiftAutoloader($callback, $namespace = '')
Zend_Loader_Autoloader
$callback, Benötigt.
Ein gültiger PHP Callback.
$namespace, Optional.
Ein String der einen Klassenpräfix Namespace repräsentiert.
Fügt eine konkrete Autoloader Implementation an den Anfang des
Autoloader Stacks hinzu. Wenn ein Namespace angegeben wird, wird dieser
Namespace verwendet um optimistischerweise zu passen; andernfalls wird
angenommen das der Autoloader ein globaler Autoloader ist.
pushAutoloader($callback, $namespace = '')
Zend_Loader_Autoloader
$callback, Benötigt.
Ein gültiger PHP Callback
$namespace, Optional.
Ein String der einen Klassenpräfix Namespace repräsentiert.
Fügt eine konkrete Autoloader Implementation an das Ende des internen
Autoloader Stacks hinzu. Wenn ein Namespace angegeben wird, wird dieser
Namespace verwendet um optimistischerweise zu passen; andernfalls wird
angenommen das der Autoloader ein globaler Autoloader ist.
removeAutoloader($callback, $namespace = '')
Zend_Loader_Autoloader
$callback, Benötigt.
Ein gültiger PHP Callback
$namespace, Optional.
Ein String der einen Klassenpräfix Namespace repräsentiert oder ein
Array von Namespace Strings.
Entfernt eine konkrete Autoloader Implementation vom internen Autoloader
Stack. Wenn ein Namespace oder mehrere Namespaces angegeben werden, wird
der Callback nur vom angegebenen Namespace oder den angegebenen
Namespaces entfernt.