Autoloading mittels PHP Namespaces

von Thomas Müller

Seit Version 5.3 unterstützt PHP (endlich) Namespaces. Autoloading ist auch nichts neues mehr – Wird eine Klasse zur Laufzeit nicht gefunden, wird versucht die Klasse mittels der __autoload() Funktion zu laden, bevor ein PHP Fehler erscheint.

Setzt man Klassen ein, die Namespaces nutzen, wird der Namespace der Funktion übergeben. Benutzt man für sein Script eine Ordnerstruktur, die den Namespaces entspricht, ist es einfach aus dem Namespace heraus auf den Ordner in dem die Klasse liegt zu schließen.

Hier ein Beispiel:

function __autoload($className) {
 
	// Die Backslashes des Namespaces zu Slashes umwandeln
	$fileName = str_replace("\\", "/", $className).".php";
 
	if (file_exists($fileName)) {
		require_once $fileName;
	}
}

Natürlich setzt dieses Beispiel voraus, dass der Dateiname dem Klassennamen entspricht. Diese Konventionen sind in anderen Sprachen üblich. Noch einfacher geht es jedoch mittels der neuen SPL Funktionen. Dadurch reicht der folgende Aufruf:

spl_autoload_extensions(".php");
spl_autoload_register();

Die Funktionalität ist dieselbe, wie in der zuvor vorgestellten __autoload() Funktion, jedoch schneller, wie man einem Kommentar im PHP Manual entnehmen kann.

Ein Beispiel

Datei: \com\my\app\foo\Foo.php

namespace com\my\app\foo;
 
class Foo {
 
}

Datei: \com\my\app\bar\Bar.php

namespace com\my\app\bar;
 
class Bar {
 
}

Datei /index.php

use \com\my\app\bar as Bar;
 
spl_autoload_extensions(".php");
spl_autoload_register();
 
$foo = new \com\my\app\foo\Foo();
$bar = new Bar\Bar();

Wie dieses kleine Beispiel zeigt, funktioniert das Autoloading auch, wenn Namespace-Aliase eingesetzt werden.