Jetzt da wir verstehen was Autoloading ist, und was die Ziele und das Design von Zend
Framework's Autoloading Lösung sind, schauen wir und an wie
Zend_Loader_Autoloader
verwendet wird.
Im einfachsten Fall wird die Klasse einfach mit "require" verwendet und anschließend
instanziert. Da Zend_Loader_Autoloader
ein Singleton ist (aus dem
Grund da auch der SPL Autoloader eine einzelne Ressource ist) verwenden
wir getInstance()
um eine Instanz zu erhalten.
require_once 'Zend/Loader/Autoloader.php'; Zend_Loader_Autoloader::getInstance();
Standardmäßig erlaubt dies das Laden jeder Klasse mit dem Klassen Namespace Präfix "Zend_" oder "ZendX_", solange Sie im eigenen include_path liegen.
Was passiert wenn man andere Namespace Präfix verwenden will? Der beste und einfachste Weg
ist der Aufruf der registerNamespace()
Methode auf der Instanz. Man
kann einen einzelnen Namespace Präfix übergeben, oder ein Array von Ihnen:
require_once 'Zend/Loader/Autoloader.php'; $loader = Zend_Loader_Autoloader::getInstance(); $loader->registerNamespace('Foo_'); $loader->registerNamespace(array('Foo_', 'Bar_'));
Alternativ kann man Zend_Loader_Autoloader
sagen das es als
"fallback" Autoloader arbeiten soll. Das bedeutet das er versuchen wird jede Klasse
aufzulösen unabhängig vom Namespace Präfix.
$loader->setFallbackAutoloader(true);
Ein Fallback Autloader sollte nicht verwendet werden
Wärend es nützlich erscheint Zend_Loader_Autoloader
als Fallback
Autoloader zu verwenden, empfehlen wir diese Praxis nicht.
Intern verwendet Zend_Loader_Autoloader
Zend_Loader::loadClass()
um Klassen zu laden. Diese Methode
verwendet include()
um zu versuchen die gegebene Klassendatei
zu laden. include()
gibt ein boolsches
FALSE
zurück wenn es nicht erfolgreich war -- löst aber auch eine
PHP Warnung aus. Der letztere Fakt kann zu einigen Problemen führen:
-
Wenn display_errors aktiviert ist, ist die Warnung in der Ausgabe enthalten.
-
Abhängig vom error_reporting Level den man ausgewählt hat, könnte es auch die Logs zuschütten.
Man kann die Fehlermeldungen unterdrücken (die Dokumentation von
Zend_Loader_Autoloader
gibt Details), aber man sollte beachten
die Unterdrückung nur relevant ist wenn display_errors aktiviert
ist; das Fehler Log wird die Meldung immer zeigen. Aus diesem Grund empfehlen wir die
Namespace Präfixe welche der Autoloader behandeln soll, immer zu konfigurieren.
Namespace Präfixe vs PHP Namespaces
Wärend dies geschrieben wurde, wurde PHP 5.3 herausgebracht. Mit dieser Version unterstützt PHP jetzt offiziell Namespaces.
Trotzdem ist Zend Framework auf vor PHP 5.3 im Einsatz, und deshalb auch Namespaces. Wenn wir im Zend Framework auf "Namespaces" verweisen, verweisen wir auf eine Praxis bei der Klassen ein Hersteller "Namespace" vorangestellt wird. Als Beispiel wird allen Zend Framework Klassen "Zend_" vorangestellt -- das ist unser Hersteller "Namespace".
Zend Framework plant die native Unterstützung von PHP Namespaces im Autoloader in zukünftigen Versionen, und seine eigene Bibliothek wird Namespaces beginnend mit Version 2.0.0 verwenden.
Wenn man eigene Autoloader hat, die man mit Zend Framework verwenden will -- möglicherweise
einen Autoloader von einer anderen Bibliothek die man verwendet -- kann man das mit
Zend_Loader_Autoloader
's pushAutoloader()
und unshiftAutoloader()
Methoden durchführen. Diese Methoden
stellen Autoloader einer Kette voran welche aufgerufen wird, oder hängen Sie an, bevor Zend
Framework's interner autoloading Mechanismus ausgeführt wird. Dieser Ansatz bietet die
folgenden Vorteile:
-
Jede Methode nimmt ein zweites optionales Argument entgegen, einen Klassen Namespace Präfix. Dieser kann verwendet werden um anzuzeigen das der angegebene Autoloader nur verwendet werden soll wenn nach Klassen mit dem angegebenen Klassenpräfix gesehen wird. Wenn die aufgelöste Klasse diesen Präfix nicht hat, wird der Autoloader übergangen -- was zu Verbesserungen der Geschwindigkeit führen kann.
-
Wenn man
spl_autoload()
's Registry verändern muss, können alle Autoloader welche Callbacks sind und auf Methoden einer Instanz sind, Probleme verursachen daspl_autoload_functions()
nicht exakt die gleichen Callbacks zurückgibt.Zend_Loader_Autoloader
hat keine entsprechenden Begrenzungen.
Autoloader welche auf diesem Weg gemanaged werden können alle gültigen PHP Callbacks sein.
// Die Funktion 'my_autoloader' dem Stack voranstellen, // um Klassen mit dem Präfix 'My_' zu managen: $loader->pushAutoloader('my_autoloader', 'My_'); // Die statische Methode Foo_Loader::autoload() dem Stack anhängen, // um Klassen mit dem Präfix 'Foo_' zu managen: $loader->unshiftAutoloader(array('Foo_Loader', 'autoload'), 'Foo_');