Start · Sprachen · PHP · Referenz · spl_autoload_call

spl_autoload_call

Funktion

Versucht, eine Klasse durch den Aufruf aller registrierten SPL-Autoload-Funktionen zu laden.

seit PHP 5.1.2 Kategorie: oop

Signatur

spl_autoload_call(string $class_name): void

Beschreibung

spl_autoload_call() durchläuft alle mit spl_autoload_register() registrierten Autoload-Funktionen und ruft sie nacheinander mit dem angegebenen Klassennamen auf, bis die Klasse erfolgreich geladen wurde. Sobald die Klasse nach einem Aufruf existiert, wird die Kette abgebrochen.

Die Funktion ist nützlich, wenn man den Autoload-Mechanismus manuell auslösen möchte, ohne dabei eine neue Instanz der Klasse zu erzeugen oder class_exists() mit dem zweiten Parameter true zu verwenden. Sie eignet sich besonders in Debugging-Szenarien oder wenn man prüfen möchte, ob eine Klasse über den Autoloader geladen werden kann.

Im Unterschied zu einem direkten Klassenaufruf wirft spl_autoload_call() keine Exception oder einen Fatal Error, wenn die Klasse nach dem Durchlaufen aller Autoloader immer noch nicht gefunden wird – sie gibt lediglich null zurück, ohne eine Fehlermeldung zu erzeugen. Das erlaubt eine sichere, kontrollierte Prüfung.

Hinweis: Ab PHP 8.0 ist die globale __autoload()-Funktion entfernt worden. Die SPL-Autoload-Kette über spl_autoload_register() ist der einzig gültige Weg, Autoloading zu implementieren.

Parameter

Name Typ Default Beschreibung
$class_name Pflicht string Der vollständige Name der Klasse (inkl. Namespace), die geladen werden soll. Der Name wird an alle registrierten Autoload-Funktionen weitergereicht.

Rückgabewert

Typ
void
Beschreibung
Die Funktion gibt keinen Wert zurück. Wenn die Klasse nach dem Durchlaufen aller Autoloader nicht verfügbar ist, wird kein Fehler ausgelöst.

Beispiele

Manuelles Auslösen des Autoloaders

<?php
spl_autoload_register(function (string $class): void {
    $file = __DIR__ . '/classes/' . str_replace('\\', '/', $class) . '.php';
    if (file_exists($file)) {
        require $file;
    }
});

// Klasse manuell laden, ohne eine Instanz zu erzeugen
spl_autoload_call('App\\Services\\MailService');

if (class_exists('App\\Services\\MailService', false)) {
    echo 'Klasse wurde erfolgreich geladen.';
} else {
    echo 'Klasse konnte nicht geladen werden.';
}
Klasse wurde erfolgreich geladen.

Autoloader-Kette mit mehreren registrierten Funktionen

<?php
// Erster Autoloader: lädt Klassen aus /lib
spl_autoload_register(function (string $class): void {
    $file = __DIR__ . '/lib/' . $class . '.php';
    if (file_exists($file)) {
        require $file;
        echo "Geladen von /lib: {$class}\n";
    }
});

// Zweiter Autoloader: lädt Klassen aus /vendor
spl_autoload_register(function (string $class): void {
    $file = __DIR__ . '/vendor/' . $class . '.php';
    if (file_exists($file)) {
        require $file;
        echo "Geladen von /vendor: {$class}\n";
    }
});

// Manuell alle Autoloader für 'Router' aufrufen
spl_autoload_call('Router');

// Prüfen ohne erneuten Autoload-Aufruf (zweites Argument = false)
var_dump(class_exists('Router', false));
Geladen von /lib: Router bool(true)

// Wichtig · Fallstricke

Kein Fatal Error bei Misserfolg: Anders als beim normalen Klassenaufruf wird kein Fatal Error ausgelöst, wenn die Klasse nicht gefunden wird. Das Ergebnis muss daher mit class_exists($name, false) geprüft werden, wobei der zweite Parameter false verhindert, dass class_exists seinerseits wieder den Autoloader aufruft.

Deprecation von __autoload(): Die globale __autoload()-Funktion wurde in PHP 7.2 als veraltet markiert und in PHP 8.0 vollständig entfernt. Ausschließlich über spl_autoload_register() registrierte Funktionen werden von spl_autoload_call() berücksichtigt.

Namespace-Beachtung: Der Klassenname muss vollständig qualifiziert übergeben werden (z. B. App\Services\MailService), damit der Autoloader den richtigen Pfad ableiten kann.