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.

Aktualisiert am 8. Juli 2008
Stichworte: , , ,
Kategorie Allgemein, Erfahrungsberichte im Umgang mit Webtechniken

4 Kommentare

Schreibe einen Kommentar · TrackBack · RSS Comments

  1. Pingback von Klassen in PHP5 automatisch includieren » MountainGrafix :: Agentur für visuelle Kommunikation – Der Corporate Blog:

    [...] Blog von Marcel habe ich gestern einen interessanten Artikel zur autoload() Funktionaliät von PHP5 gelesen und daher möchte ich das Thema selbst [...]

    10. Juli 2008 @ 08:51
  2. Pingback von Autoloading leicht gemacht Teil 2 | Der Entwickler Blog von MM Newmedia:

    [...] » MountainGrafix :: Agentur für visuelle Kommunikation – Der Corporate Blog bei Autoloading leicht gemachtSascha Schoppengerd bei Lösung für ein MySQL UTF-8 Umlautproblemadmin bei Lösung für ein MySQL [...]

    15. Juli 2008 @ 14:47
  3. Pingback von Mehere Autoload Funktionen mit SPL | Der Entwickler Blog von MM Newmedia:

    [...] 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 [...]

    27. Januar 2009 @ 13:32
  4. Kommentar von Bronco:

    Unbezahlbar der Tip!!!!

    6. Juli 2009 @ 03:47

Schreibe einen Kommentar