In PHP liefern spl_autoload_register und spl_autoload_unregister einen leistungsstarken Mechanismus für die Verwaltung von Autoloadern für Klassen. In komplexen Projekten oder Frameworks kann es jedoch Fälle geben, in denen der Autoloader fehlschlägt, doppelte Registrierungen oder sogar unerwartete Entfernung. Dieser Artikel konzentriert sich auf ein Kernproblem:
Bei der Registrierung von Autoloading -Funktionen mit spl_autoload_register () werden diese Funktionen in einem internen Funktionsstapel gespeichert. Nur wenn eine undefinierte Klasse aufgerufen wird, ruft PHP diese Autoloader wiederum auf, um zu laden.
Wir können die aktuell registrierte Autoloaderliste über spl_autoload_functions () anzeigen:
$autoloaders = spl_autoload_functions();
print_r($autoloaders);
Diese Funktion gibt ein Array-Auflistung aller registrierten Autoloader zurück, einschließlich anonymer Funktionen, Klassenmethoden (statisch und nicht statisch) usw.
Der direkteste Weg zu bestimmen, ob ein automatischer Lader noch darin besteht, ihn mit dem von spl_autoload_functions () zurückgegebenen Ergebnis zu vergleichen. Angenommen, wir haben den folgenden registrierten Loader:
function myAutoloader($class) {
include 'classes/' . $class . '.class.php';
}
spl_autoload_register('myAutoloader');
Wir können so beurteilen:
$autoloaders = spl_autoload_functions();
$isRegistered = false;
foreach ($autoloaders as $loader) {
if ($loader === 'myAutoloader') {
$isRegistered = true;
break;
}
}
echo $isRegistered ? 'Eingetragen' : 'Nicht registriert';
Wenn Sie sicher sind, dass ein Lader registriert wurde und ihn entfernen möchte, können Sie spl_autoload_unregister verwenden:
if ($isRegistered) {
spl_autoload_unregister('myAutoloader');
}
Diese Funktion wird aufgerufen, wenn der Lader nicht registriert ist und eine Warnung verursacht. Um Fehler zu vermeiden, ist es daher am besten, zuerst zu beurteilen und dann zu entfernen.
Für die Registrierungsformulare von Klassenmethoden (z. B. [Klassenname, 'methodName' ] oder Objektmethoden sollte auch die Urteilsmethode detaillierter sein. Zum Beispiel:
class MyLoader {
public static function load($class) {
include 'libs/' . $class . '.php';
}
}
spl_autoload_register(['MyLoader', 'load']);
Um festzustellen, ob ein solcher Lader existiert, können Sie dies tun:
$autoloaders = spl_autoload_functions();
foreach ($autoloaders as $loader) {
if (is_array($loader) && $loader[0] === 'MyLoader' && $loader[1] === 'load') {
echo "MyLoader::load Eingetragen";
}
}
Anonyme Funktionen können nicht auf traditionelle Weise verglichen werden, da sie keine Namen haben. Zu diesem Zeitpunkt können Sie den von spl_autoload_functions () zurückgegebenen Inhalt verwenden, um einige Urteile der Verschlussfunktion zu fällen. Um sie jedoch zu entfernen, müssen Sie die Referenzen normalerweise manuell während der Registrierung aufzeichnen. Zum Beispiel:
$anonLoader = function($class) {
include 'includes/' . $class . '.php';
};
spl_autoload_register($anonLoader);
// Die ursprüngliche Referenz ist beim Entfernen erforderlich
spl_autoload_unregister($anonLoader);
Möchten Sie den Lader -Status schnell debuggen? Schreiben Sie einfach eine Debugging -Funktion:
function dumpAutoloaders() {
echo "<pre>";
foreach (spl_autoload_functions() as $loader) {
if (is_string($loader)) {
echo "Function: $loader\n";
} elseif (is_array($loader)) {
echo "Method: " . (is_object($loader[0]) ? get_class($loader[0]) : $loader[0]) . "::{$loader[1]}\n";
} elseif ($loader instanceof Closure) {
echo "Closure\n";
}
}
echo "</pre>";
}
Integrieren Sie es in den Debug -Hintergrund, zum Beispiel:
// gitbox.net/tools/debug.php
require 'debug_tools.php';
dumpAutoloaders();
Dies erleichtert leicht zu überprüfen, welche Lader derzeit registriert sind.
Um festzustellen, ob der automatische Lader existiert, können Sie die von spl_autoload_functions () zurückgegebene Liste verwenden, um sie mit einer geeigneten bedingten Struktur zu vergleichen und zu kombinieren, um ein genaues Urteilsvermögen zu erhalten. Für einige anonyme Funktionen, die nicht direkt beurteilt werden können, kann die Referenz während der Registrierung für nachfolgendes Urteil oder Stornieren gespeichert werden. Bei der Prämisse des vernünftigen Gebrauchs kann SPL_Autoload_unregister ungültige oder widersprüchliche Lader effektiv reinigen, um die Robustheit und Wartbarkeit der Systeme zu verbessern.