Signatur
Beschreibung
Yaf_Loader ist die zentrale Autoloading-Komponente des Yaf-Frameworks (Yet Another Framework). Sie registriert sich automatisch bei der PHP-SPL-Autoload-Kette und lädt Klassen nach einem festgelegten Namenskonventions-Schema aus dem Anwendungsverzeichnis.
Die Klasse arbeitet nach dem Singleton-Muster: Es existiert immer genau eine Instanz, die über Yaf_Loader::getInstance() abgerufen wird. Der Loader unterscheidet zwischen lokalen Klassen (aus dem eigenen Anwendungsverzeichnis, z. B. application/library) und globalen Klassen aus einem gemeinsamen Library-Verzeichnis, das über yaf.library in der php.ini konfiguriert wird.
Klassennamen werden durch Unterstriche in Verzeichnispfade umgewandelt: Eine Klasse namens User_Model_Profile wird z. B. als User/Model/Profile.php aufgelöst. Dieses Verhalten ermöglicht eine strukturierte Projektorganisation ohne explizite require-Anweisungen.
Im Gegensatz zu modernen PSR-4-Autoloadern (Composer) ist Yaf_Loader speziell auf die Yaf-Konventionen zugeschnitten und als C-Extension implementiert, was eine sehr hohe Performance gewährleistet.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $local_library_path | string | Pfad zum lokalen Library-Verzeichnis der Anwendung. Wird in der Regel automatisch aus der Yaf-Konfiguration gesetzt. | |
| $global_library_path | string | Pfad zum globalen Library-Verzeichnis, das anwendungsübergreifend genutzt werden kann (entspricht yaf.library in der php.ini). |
Beispiele
Singleton-Instanz des Loaders abrufen
<?php
// Yaf_Loader wird normalerweise automatisch von Yaf_Application initialisiert.
// Manuelle Abfrage der Instanz:
$loader = Yaf_Loader::getInstance();
// Aktuellen lokalen Library-Pfad ausgeben
echo $loader->getLibraryPath();
// z. B. /var/www/myapp/application/library
Eigenes Verzeichnis zum Loader hinzufügen
<?php
// Anwendung initialisieren
$app = new Yaf_Application('/var/www/myapp/conf/application.ini');
// Loader-Instanz holen und zusätzliches Verzeichnis registrieren
$loader = Yaf_Loader::getInstance();
$loader->setLibraryPath('/var/www/shared/library', true); // true = globale Library
// Ab jetzt wird auch /var/www/shared/library beim Autoloaden durchsucht.
// Eine Klasse Util_StringHelper wird als /var/www/shared/library/Util/StringHelper.php gesucht.
$helper = new Util_StringHelper();
$helper->doSomething();
Prüfen, ob eine Klasse als lokale Klasse registriert ist
<?php
$loader = Yaf_Loader::getInstance(
'/var/www/myapp/application/library',
'/var/www/shared/library'
);
// Namespace als lokalen Namespace registrieren
$loader->registerLocalNamespace('MyApp');
// Prüfen
var_dump($loader->isLocalName('MyApp_User'));
// bool(true) -> wird aus dem lokalen Verzeichnis geladen
var_dump($loader->isLocalName('ThirdParty_Lib'));
// bool(false) -> wird aus dem globalen Verzeichnis geladen
// Wichtig · Fallstricke
Singleton-Muster: Yaf_Loader kann nicht direkt mit new instanziiert werden. Die einzige Möglichkeit, eine Instanz zu erhalten, ist Yaf_Loader::getInstance().
Kompatibilität mit Composer: Wenn Yaf zusammen mit dem Composer-Autoloader verwendet wird, können Konflikte entstehen, da beide sich in die SPL-Autoload-Kette eintragen. Es empfiehlt sich, die Reihenfolge über spl_autoload_register() und spl_autoload_unregister() sorgfältig zu steuern oder yaf.use_spl_autoload = 1 in der php.ini zu setzen.
Namenskonvention: Unterstriche (_) im Klassennamen werden als Verzeichnistrenner interpretiert. Klassen ohne Unterstriche werden direkt im Library-Verzeichnis gesucht. Namespaces mit Backslash werden seit Yaf 3.x ebenfalls unterstützt.
Performance: Da Yaf_Loader als C-Extension implementiert ist, ist der Overhead sehr gering. Dennoch sollte das Library-Verzeichnis nicht unnötig groß sein, da jeder fehlgeschlagene Ladeversuch einen Dateisystemzugriff verursacht.