Autoloading leicht gemacht

Seit geraumer Zeit schon beschäftige ich mich mit der objektorientierten Programmierung unter PHP5.  Ich handhabe es hier wahrscheinlich wie alle anderen Entwickler auch. Jede definierte Klasse bekommt eine PHP Quelldatei. Je nach Umfang des Projektes stößt man dann relativ schnell auf das nervige Problem die entwickelten Klassen per require_once() in einer langen Liste einzubinden. Abhilfe schafft hier das Autoloading unter PHP5.

An sich ist diese Funktion sehr arbeitserleichternd. Gleichzeitig birgt diese Funktion aber auch ein paar Schwächen bzgl. der Fehlerbehandlung, die sich aber mit ein paar kleinen Tricks auch umgehen lassen.

Ich persönlich stand vor einem ganz anderem Problem. Die oben erwähnten entwickelten Klassen liegen in verschiedenen Verzeichnissen, die es beim Autoloading darzustellen gilt.  Dazu kommt noch, dass ich lokal unter einem Windows System entwickle und hier ein simpler Slash zur Trennung der Verzeichnisse benutzt wird. Auf einem produktiven Server mit einem Linux System verwendet man aber einen Backslash zur Trennung der Verzeichnisse.

Folgende Funktion habe ich aus diesem Problem heraus entwickelt:

function __autoload($className)
{
	// Hier halten wir mal die Verzeichnisse fest
    $directories = array(
    	'bla|',
    	'bla|blubb|',
    	'bla|yadda|'
    );

    foreach($directories as $directory)
    {
    	// Bilden wir den Pfad, mit der PHP Konstanten
    	$directory = str_replace('|', DIRECTORY_SEPARATOR, $directory);
        if (file_exists(ROOT_PATH . $directory . $className . '.class.php'))
        {
            require_once(ROOT_PATH . $directory . $className . '.class.php');
            // Abbruch der foreach Schleife um effezient zu bleiben
            return;
        }
    }
}

new MyClass();

Zur Erklärung:
Zunächst halten wir alle benötigten Verzeichnisse, in denen sich die Quelldateien der Klassen befinden in einem Array fest. Um die Kategoriestruktur unabhängig von der Umgebung zu halten, trenne ich die Verzeichnisse einfach mit dem String |, der später mit dem tatsächlichen Trennzeichen der Verzeichnisse ersetzt wird.
Das Array mit den Verzeichnissen wird nun bei jeder Initialisierung einer Klasse durchlaufen und sobald die Klasse gefunden wurde, wird die Schleife aus Gründen der Effizienz abgebrochen.

Fertig! Schon hatte ich dann eine effizient arbeitende, von der Entwicklungsumgebung unabhängige Autoload Funktion.

4 Gedanken zu „Autoloading leicht gemacht“

Antworten auf BroncoAntwort abbrechen

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