Signatur
Beschreibung
spl_autoload_register() fügt eine Callable dem SPL-Autoloader-Stack hinzu. Sobald PHP auf eine unbekannte Klasse, ein Interface oder einen Trait trifft, ruft es der Reihe nach alle registrierten Autoloader auf, bis die Klasse geladen wurde oder kein Autoloader mehr übrig ist. Dadurch lassen sich mehrere Autoloader gleichzeitig betreiben – z. B. eigener Code neben einer Bibliothek wie Composer.
Der übergebene Callback erhält den vollqualifizierten Klassennamen (inkl. Namespace) als erstes Argument. Innerhalb des Callbacks wird typischerweise require oder include aufgerufen, um die entsprechende Datei zu laden. Schlägt kein Autoloader an, wirft PHP eine Error-Exception (Class not found).
Mit dem Parameter $prepend kann ein Autoloader an den Anfang des Stacks gesetzt werden, was nützlich ist, wenn ein bestimmter Lader höhere Priorität haben soll. In modernen PHP-Projekten wird spl_autoload_register() meist indirekt über den Composer-Autoloader genutzt, der intern ebenfalls auf diese Funktion aufbaut.
Die ältere Funktion __autoload() ist seit PHP 7.2 als deprecated markiert und in PHP 8.0 entfernt worden; spl_autoload_register() ist der empfohlene Ersatz.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $callback | callable|null | null | Die Callable, die beim Laden einer unbekannten Klasse aufgerufen wird. Sie erhält den vollqualifizierten Klassennamen als string. Wird null übergeben, registriert PHP die interne Standardimplementierung spl_autoload(). |
| $prepend | bool | false | Ist dieser Wert true, wird der Autoloader an den Anfang des Autoloader-Stacks gesetzt statt ans Ende. Nützlich, wenn der neue Autoloader Vorrang vor bereits registrierten haben soll. |
| $throw | bool | true | Gibt an, ob eine \LogicException geworfen werden soll, wenn der Callback nicht registriert werden kann (z. B. weil er nicht aufrufbar ist). Bei false wird stattdessen eine PHP-Warnung ausgegeben. |
Rückgabewert
true bei Erfolg zurück, false wenn der Callback bereits registriert ist oder nicht registriert werden konnte (sofern $throw auf false gesetzt ist).Beispiele
Einfacher PSR-4-kompatibler Autoloader
<?php
spl_autoload_register(function (string $className): void {
// Namespace-Trennzeichen in Verzeichnis-Trennzeichen umwandeln
$file = __DIR__ . '/src/' . str_replace('\\', DIRECTORY_SEPARATOR, $className) . '.php';
if (file_exists($file)) {
require $file;
}
});
// Wenn nun folgende Klasse verwendet wird, sucht PHP automatisch
// nach der Datei src/App/Controller/HomeController.php
$controller = new App\Controller\HomeController();
Mehrere Autoloader registrieren (Stack-Konzept)
<?php
// Erster Autoloader – lädt Bibliotheksklassen
spl_autoload_register(function (string $class): void {
$path = __DIR__ . '/lib/' . str_replace('\\', '/', $class) . '.php';
if (file_exists($path)) {
require $path;
}
});
// Zweiter Autoloader – lädt Anwendungsklassen mit höchster Priorität
spl_autoload_register(function (string $class): void {
$path = __DIR__ . '/app/' . str_replace('\\', '/', $class) . '.php';
if (file_exists($path)) {
require $path;
}
}, prepend: true); // wird zuerst ausgeführt
// Alle registrierten Autoloader auflisten
var_dump(spl_autoload_functions());
Autoloader als statische Klassenmethode
<?php
class Autoloader
{
public static function load(string $class): void
{
$file = __DIR__ . '/classes/' . $class . '.php';
if (file_exists($file)) {
require_once $file;
}
}
}
// Statische Methode als Callable übergeben
spl_autoload_register(['Autoloader', 'load']);
// Alternativ mit erstklassiger Callable-Syntax (ab PHP 8.1)
// spl_autoload_register(Autoloader::load(...));
// Wichtig · Fallstricke
Sicherheitshinweis: Leite den Klassennamen niemals ungefiltert direkt als Dateipfad weiter, ohne dessen Inhalt zu validieren. Ein manipulierter Klassenname könnte sonst dazu missbraucht werden, beliebige Dateien zu laden (Path-Traversal). Prüfe z. B. mit realpath(), ob die aufgelöste Datei noch innerhalb des erlaubten Basisverzeichnisses liegt.
Kompatibilität: Die alte magische Funktion __autoload() wurde in PHP 7.2 als deprecated markiert und in PHP 8.0 vollständig entfernt. Projekte, die noch auf __autoload() setzen, müssen auf spl_autoload_register() migrieren.
Composer: In den meisten modernen Projekten wird dieser Autoloader nicht manuell geschrieben, sondern durch Einbinden von vendor/autoload.php genutzt, das Composer automatisch generiert und intern spl_autoload_register() verwendet.