PHP Autoload die Dritte

Nachdem ich nun ganze zwei Artikel zum Thema Autoload mit PHP geschrieben habe, musste ich die daraus gewonnen Erkenntnisse doch in der letzten Woche über den Haufen werfen oder besser gesagt mir etwas besseres einfallen lassen, um ein Problem zu lösen.

Mit dem Release easyLink 3 Alpha10 hat Mountaingrafix die Plugin API freigegeben. Kann auch sein, dass es diese API schon in den vorhergehenden Alpha Releases gab und ich die nicht gesehen habe. Auf jeden Fall machte ich mich daran ein Plugin zu schreiben. Das Plugin selbst umfasst ein paar Klassen, die den reibungslosen Ablauf garantieren sollen. Natürlich habe ich diese Klassen auch mittels einer Autoload Funktion eingebunden, da ich als Programmierer grundsätzlich zu faul bin alles per require einzubinden.

Allerdings ergab sich daraus ein Problem. Die Software selbst beinhaltete schon eine Autoload Funktion und das Plugin verursachte natürlich mit seiner eigenen Autoload Funktionen fatale Fehler. Das konnte also nicht die Lösung sein. Wie dem auch ist, bietet PHP ab dem Release 5.1.2 die SPL Erweiterung als Standard Paket. Darin enthalten sind auch die SPL Autoload Funktionen, die es ermöglichen mehrere Autoload Funktionen nacheinander zu integrieren.

Hier ein kleines Beispiel:

class MyAutoload {
    /**
     * Die eigene Autoload Funktion
     */
    public static function myAutoloadFunction($className) {	
    	$dirname  = dirname(__FILE__);
    	$fileName = str_replace('|', DIRECTORY_SEPARATOR, preg_replace('/(?!^)[[:upper:]]/', '|\0', $className));
    	$file     = $dirname . DIRECTORY_SEPARATOR . $fileName . '.class.php';
    	if (is_readable($file)) 
    	    require $file;
    }
        
    /**
     * Registriert die Autoload Funktion im SPL Stack
     */
    public static function register() {
        spl_autoload_register(array(__class__, 'myAutoloadFunction'));
    }
}

// Die Autoload Funktion initialisieren
MyAutoload::register();

Das oben gezeigte Beispiel zeigt, wie man eine Autoload Funktion mit den SPL Funktionen integrieren kann. Mehrere Klassen oder Funktionen würden im Stack gespeichert und sofern eine Klasse im Script selbst aufgerufen wurde, arbeitet SPL den gesamten Stack mit allen registrieren Autoload Funktionen ab. Sollte die aufgerufene Klasse mit keiner der Funktionen ermittelt werden können, wird ein Fehler geworfen.

Wieso SPL Autoload nutzen?

Der Sinn ist einfach erklärt. Die magische Funktion __autoload(), die PHP als Standard mitbringt, kann nur einmal initialisiert werden. Das ist auch vollkommen ausreichend für einfache Anwendungen, die nicht erweiterbar sind. Sobald eine Software aber eine API oder eine anderweitige Schnittstelle für Erweiterungen mit sich bringt, macht es durchaus Sinn die SPL Funktionen zu nutzen. SPL legt hier einen so genannten Stack an, der im Grunde genommen ein Container mit allen Autoload Funktionen ist. Die im Stack befindlichen Autoload Funktionen werden nacheinander durch SPL abgearbeitet. Demnach kann ich also auch in meinem Plugin auf den Komfort einer Autoload zurückgreifen.

Noch Fragen?

Fragen zu diesem Thema können gern als Kommentar gestellt werden. Es sei denn sie haben konkretere Vorstellungen und möchten gern wissen, wie man ihr Projekt umsetzen kann. Auch in diesem Fall helfen wir Ihnen gern weiter.

4 Gedanken zu „PHP Autoload die Dritte“

  1. Hallo,

    auch wenn die Frage vllt. dumm ist, aber wenn das Programm schon eine autoload Funktion hat, könnte man die in der Erweiterung nicht einfach wegelassen?

    Antworten
  2. Sofern man in der Verzeichnisstruktur arbeiten möchte, die das Programm von Hause aus mit sich bringt, könnte man natürlich auf eine weitere Autoload Funktion verzichten und die bereits existierende nutzen. Bei einem solchen Fall sehe ich auch keinen wirklichen Sinn darin eine weitere Autoload Funktion via SPL einzubinden.

    Bei sehr komplexen Erweiterungen, die nicht unbedingt mit der mitgebrachten Verzeichnisstruktur des Hauptprogrammes harmonisieren oder eine eigene Verzeichnisstruktur mitbringen, ist es aber vorteilhafter eine eigene Autoload Funktion zu etablieren. Während die bereits im Programm existierende Autoload Funktion garantiert, dass das Hauptprogramm weiterhin reibungslos läuft, wird die zweite Autoload Funktion dafür sorgen, dass Klassen in der neuen Verzeichnisstruktur der Erweiterung ohne Probleme aufgerufen werden können.

    Wenn die mitgebrachte Autoload Funktion die gehobenen Ansprüche einer möglichen Erweiterung nicht erfüllt, ist es mit der SPL möglich etliche weitere Autoload Funktionen zu integrieren, die nach ihrer Reihenfolge im Stack abgearbeitet werden. Findet die neue Autoload Funktion der Erweiterung also eine Klasse nicht, wird versucht die Klasse über die alte Autoload Funktion zu finden.

    Ob man jetzt eine weitere Autoload Funktion nutzt, bleibt aber jedem selbst überlassen und hängt immer davon ab, was genau erzielt werden soll.

    Antworten

Kommentar verfassen

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.