# 5.5.3 Autoloading (SPL)

Im Unterkapitel Beispiel mit Vererbung, Aggregation und Komposition haben wir die Klassen in verschiedene Dateien geschrieben (je Klasse eine Datei) und mussten im Hauptprogramm jeweils die Dateien mit require_once laden:

    1
    2
    3
    4
    5
    6
    7
    <?php
    require_once __DIR__.DIRECTORY_SEPARATOR.'Course.php';
    require_once __DIR__.DIRECTORY_SEPARATOR.'Office.php';
    require_once __DIR__.DIRECTORY_SEPARATOR.'Person.php';
    require_once __DIR__.DIRECTORY_SEPARATOR.'Professor.php';
    require_once __DIR__.DIRECTORY_SEPARATOR.'Student.php';
    ...

Stellen Sie sich nun vor, dass Sie viele umfangreiche Klassenbibliotheken einbinden müssen, also hunderte von Dateien. Das Einbinden von Hand wäre sehr mühsam und fehlerträchtig.

Mit Autoloading bezeichnet man das automatische Einbinden dieser Dateien. Hierzu gibt es eine PHP Funktion spl_autoload_register. Damit werden alle require_once-Aufrufe überflüssig.

Beim Autoload werden die Fehlermeldungen von PHP ausgenutzt, die dadurch entstehen, dass die notwendigen Dateien nicht gefunden werden. Wenn der Klassenname gleich dem Dateinamen ist, könnten über die Fehlermeldung die Dateien identifiziert und eingebunden werden. Eine gute Erklärung finden Sie im Video https://www.youtube.com/watch?v=VC5HM0J0_Vo.

Hinweis

Also statt einer langen Erklärung auf dieser Seite schauen Sie einfach das Video an https://www.youtube.com/watch?v=VC5HM0J0_Vo (2:47 Min).

Die Lösung für das Autoloading-Problem ist im folgenden Sourcecode:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    <?php
    function autoload($className)
    {
        if (file_exists(__DIR__.DIRECTORY_SEPARATOR."{$className}.php"))
        {
            require_once __DIR__.DIRECTORY_SEPARATOR."{$className}.php";
        }
    }
    spl_autoload_register("autoload");
    ...

Hinweis für Profis

Die gezeigte Lösung enthält noch keine Sonderfälle, ist dafür aber didaktisch nachvollziehbar. Wer ein wirklich komplettes Autoloading möchte (inklusive der Berücksichtigung von Namespaces), der sollte die PSR-4: Autoloader berücksichtigen oder gleich die PSR-4 Example Implementations verwenden.

PSR = PHP Standard Recommendations