Hierfür bietet sich die Funktion __autoload(); an, mit der das realisierbar ist. Diese fängt jeden Aufruf von new Class(); ab und bindet die entsprechende Datei ein. In der hier vorgestellten Variante gibt es noch die Möglichkeit über ein Array die Verzeichnisse zu konfigurieren, in denen nach den Klassendateien gesucht werden soll. Dies kann besonders bei Verwendung von Template-Engines wie zum Beispiel Smarty von Vorteil sein, da diese eine eigene Verzeichnisstruktur mitbringen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
 * Autoloader for classes.
 */

function __autoload($var_sClassName) {
    /**
     * Directories where we search for classes.
     *
     * @var array
     */

    $array_ScanDirs = array(
        SMARTY_DIR,
        LIB_DIR
    );

    foreach($array_ScanDirs as $var_sDir) {
        if(file_exists(sprintf('%1$s%2$s.class.php', $var_sDir, $var_sClassName))) { // Check if file exists.
            include_once(sprintf('%1$s%2$s.class.php',
                $var_sDir,
                $var_sClassName
            ));
        }
    }
}

Wird nun ein Aufruf

1
$obj_Smarty = new Smarty();

als Beispiel für Smarty-Template gestartet, so wird die Funktion aktiv und durchsucht die hinterlegten Verzeichnisse nach der Datei Smarty.class.php und bindet diese ein, wenn sie gefunden wird. Durch den Check mit file_exists() wird verhindert, dass es Fehlermeldungen gibt, wenn die Datei nicht existiert. es wird dann einfach nicht versucht diese einzubinden.

Viel Spaß damit :-)

Update: 19. September 2011

Oben genannte Funktion führt bei Verwendung von Smarty 3.x zu einer Fehlermeldung, welche da lautete:

Fatal error: Class ‘Smarty_Internal_TemplateCompilerBase’ not found in Smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php on line 23

Dies liegt daran, dass Smarty ab Version 3 einen eigenen Autoloader mitbringt und sich diese beiden somit gegenseitig stören. Der Autoloader von Smarty wir über spl_autoload_register() geladen und ein Eigner verhindert dies.

Die Lösung ist es, den eigenen Autoloader ebenfalls über spl_autoload_register() zu registrieren. Ein Beispiel:

1
2
3
4
5
function autoload($var_sClassName) {
    // Hier der Code des Autoloaders, kann von oben übernommen werden ...
}

spl_autoload_register("autoload");

Zu beachten ist hierbei, dass die beiden Unterstriche am Beginn des Funktionsnamen hierbei wegbleiben. Danach kann der eigene Autoloader wie gewohnt genutzt werden.

Artikel weiterempfehlen
Werbung

2 Meinungen zu “PHP: Autoloader für Klassen

Hinterlasse eine Antwort

Ihre Email-Adresse wird nicht veröffentlicht. Pflichtfelder sind durch * markiert.

Sie können folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>