Start · Sprachen · PHP · Referenz · Yaf_Loader

Yaf_Loader

Klasse

Bietet eine umfassende Autoloading-Lösung für das Yaf-Framework und lädt Klassen automatisch aus konfigurierbaren Verzeichnissen.

seit PHP 2.0.0 Kategorie: misc

Signatur

class Yaf_Loader

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
/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
bool(true) bool(false)

// 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.