Start · Sprachen · PHP · Referenz · spl_autoload_functions

spl_autoload_functions

Funktion

Gibt eine Liste aller über <code>spl_autoload_register()</code> registrierten Autoload-Funktionen zurück.

seit PHP 5.1.0 Kategorie: oop

Signatur

spl_autoload_functions(): array|false

Beschreibung

spl_autoload_functions() liefert ein Array mit allen aktuell im SPL-Autoloader-Stack registrierten Callables. Diese werden automatisch aufgerufen, wenn eine Klasse, ein Interface oder ein Trait verwendet wird, der noch nicht geladen wurde.

Die Funktion ist besonders nützlich zur Diagnose und Fehlersuche: Sie ermöglicht es zu prüfen, welche Autoloader aktiv sind, in welcher Reihenfolge sie aufgerufen werden und ob ein bestimmter Autoloader bereits registriert ist – etwa um doppelte Registrierungen zu vermeiden.

Wurde noch kein Autoloader mit spl_autoload_register() registriert, gibt die Funktion false zurück. Sobald mindestens ein Autoloader registriert ist, wird ein Array mit den entsprechenden Callables zurückgegeben – auch dann, wenn nur der interne Standard-Autoloader spl_autoload registriert wurde.

Die Rückgabe spiegelt die genaue Reihenfolge wider, in der die Autoloader abgearbeitet werden. Das ist relevant, wenn mehrere Autoloader (z. B. von verschiedenen Bibliotheken oder Frameworks) gleichzeitig im Einsatz sind.

Rückgabewert

Typ
array|false
Beschreibung
Gibt ein array mit allen registrierten Autoload-Callables zurück. Wurde noch kein Autoloader registriert, wird false zurückgegeben.

Beispiele

Registrierte Autoloader ausgeben

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

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

$autoloaders = spl_autoload_functions();
echo 'Anzahl registrierter Autoloader: ' . count($autoloaders) . PHP_EOL;
var_dump($autoloaders);
Anzahl registrierter Autoloader: 2 array(2) { [0]=> object(Closure)#1 (0) { } [1]=> object(Closure)#2 (0) { } }

Prüfen, ob ein bestimmter Autoloader bereits registriert ist

<?php
function myAutoloader(string $class): void {
    $file = __DIR__ . '/' . $class . '.php';
    if (file_exists($file)) {
        require $file;
    }
}

// Nur registrieren, wenn noch nicht vorhanden
$autoloaders = spl_autoload_functions();
if ($autoloaders === false || !in_array('myAutoloader', $autoloaders, true)) {
    spl_autoload_register('myAutoloader');
    echo 'Autoloader registriert.' . PHP_EOL;
} else {
    echo 'Autoloader war bereits registriert.' . PHP_EOL;
}

// Zweiter Aufruf: Autoloader ist nun bereits vorhanden
$autoloaders = spl_autoload_functions();
if ($autoloaders === false || !in_array('myAutoloader', $autoloaders, true)) {
    spl_autoload_register('myAutoloader');
    echo 'Autoloader registriert.' . PHP_EOL;
} else {
    echo 'Autoloader war bereits registriert.' . PHP_EOL;
}
Autoloader registriert. Autoloader war bereits registriert.

// Wichtig · Fallstricke

Rückgabe false vs. leeres Array: Solange kein Autoloader registriert wurde, gibt die Funktion false zurück – kein leeres Array. Beim Prüfen des Rückgabewerts sollte daher immer explizit auf false geprüft werden (=== false), um eine korrekte Verzweigung zu gewährleisten.

Closures lassen sich schwer vergleichen: Wenn Autoloader als anonyme Funktionen (Closures) registriert werden, ist es schwierig, mit in_array() zu prüfen, ob eine bestimmte Closure bereits registriert ist. Benannte Funktionen oder statische Methoden (als String 'Klasse::methode') lassen sich deutlich einfacher identifizieren.

Die Funktion ist rein lesend und hat keinerlei Seiteneffekte auf den Autoloader-Stack.