Start · Sprachen · PHP · Referenz · spl_autoload_unregister

spl_autoload_unregister

Funktion

Entfernt eine zuvor registrierte Autoload-Funktion aus der SPL-Autoload-Queue.

seit PHP 5.1.2 Kategorie: oop

Signatur

spl_autoload_unregister(callable $callback): bool

Beschreibung

spl_autoload_unregister() entfernt eine über spl_autoload_register() registrierte Callback-Funktion aus der internen Autoload-Queue des SPL-Autoloaders. Sobald der Callback entfernt ist, wird er beim automatischen Laden von Klassen, Interfaces oder Traits nicht mehr aufgerufen.

Diese Funktion ist nützlich, wenn ein Autoloader nur temporär aktiv sein soll – etwa in Test-Szenarien, bei Plugin-Systemen, die Autoloader dynamisch hinzufügen und entfernen, oder wenn ein bestimmter Autoloader nach dem Laden einer bestimmten Klasse nicht mehr benötigt wird. So lässt sich die Autoload-Queue sauber verwalten und Overhead vermeiden.

Der übergebene callback muss exakt so spezifiziert werden, wie er bei der Registrierung angegeben wurde. Bei anonymen Funktionen muss die ursprüngliche Referenz (z. B. eine Variable) übergeben werden, da zwei identisch aussehende Closures als unterschiedliche Objekte gelten. Bei Methoden-Callbacks (Array mit Klasse/Objekt und Methodenname) muss ebenfalls dieselbe Schreibweise verwendet werden.

Ist die Autoload-Queue nach dem Entfernen leer, verhält sich PHP so, als wäre kein SPL-Autoloader registriert – falls zuvor __autoload() (veraltet ab PHP 8.0) genutzt wurde, wird diese Funktion wieder aktiv, sofern sie noch vorhanden ist.

Parameter

Name Typ Default Beschreibung
$callback Pflicht callable Der Autoload-Callback, der aus der Queue entfernt werden soll. Muss identisch mit dem bei spl_autoload_register() übergebenen Wert sein – bei Closures also dieselbe Variable, bei Methoden-Arrays dieselbe Schreibweise.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Callback erfolgreich aus der Queue entfernt wurde, andernfalls false (z. B. wenn der Callback nicht registriert war).

Beispiele

Einfacher Autoloader registrieren und wieder entfernen

<?php

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

// Autoloader registrieren
spl_autoload_register('myAutoloader');

// Prüfen, welche Autoloader aktiv sind
var_dump(spl_autoload_functions());
// array(1) { [0]=> string(12) "myAutoloader" }

// Autoloader wieder entfernen
$result = spl_autoload_unregister('myAutoloader');
var_dump($result); // bool(true)

var_dump(spl_autoload_functions());
// array(0) { }
array(1) { [0]=> string(12) "myAutoloader" } bool(true) array(0) { }

Closure als Autoloader temporär verwenden

<?php

// Closure in Variable speichern – wichtig für späteres Entfernen!
$autoloader = static function (string $className): void {
    $file = __DIR__ . '/src/' . str_replace('\\', '/', $className) . '.php';
    if (file_exists($file)) {
        require $file;
    }
};

spl_autoload_register($autoloader);

echo count(spl_autoload_functions()); // 1

// Closure mit derselben Variable entfernen
spl_autoload_unregister($autoloader);

echo count(spl_autoload_functions()); // 0
1 0

Methoden-Autoloader einer Klasse entfernen

<?php

class MyLoader {
    public function load(string $className): void {
        // Lade-Logik ...
    }
}

$loader = new MyLoader();

// Als Array-Callback registrieren
spl_autoload_register([$loader, 'load']);

var_dump(count(spl_autoload_functions())); // int(1)

// Gleiche Schreibweise zum Entfernen verwenden
spl_autoload_unregister([$loader, 'load']);

var_dump(count(spl_autoload_functions())); // int(0)
int(1) int(0)

// Wichtig · Fallstricke

Closures und Identität: Da zwei Closures mit identischem Code unterschiedliche Objekte sind, muss die ursprüngliche Variable übergeben werden. Eine neu erstellte, identisch aussehende Closure wird nicht als dieselbe erkannt und kann daher nicht zum Entfernen verwendet werden.

Verhalten bei leerer Queue: Wenn nach dem Entfernen keine Autoloader mehr in der Queue vorhanden sind, greift PHP auf sein Standard-Verhalten zurück. In PHP 7.x war dies die veraltete __autoload()-Funktion; ab PHP 8.0 existiert __autoload() nicht mehr und wurde vollständig entfernt.

Rückgabewert prüfen: Es empfiehlt sich, den Rückgabewert zu prüfen, da false signalisiert, dass der angegebene Callback gar nicht registriert war – ein Hinweis auf einen Logikfehler im Code.