In PHP bietet spl_autoload_register einen leistungsstarken Mechanismus zum dynamischen Register von Autoloadfunktionen von Klassen, während spl_autoload_unregister verwendet wird, um diese registrierten Lader zu entfernen. Wenn Sie jedoch fälschlicherweise spl_autoload_unregister zu ernsthaften Problemen führen, kann dies zu schwerwiegenden Problemen führen, insbesondere wenn Sie versehentlich einen Lader entfernen, der nicht aufgehoben werden sollte, kann der Autoloading -Mechanismus der gesamten Anwendung beeinträchtigt werden.
In diesem Artikel wird erläutert, wie Sie Lader sorgfältig identifizieren und vermeiden können, die bei Verwendung von spl_autoload_unregister nicht entfernt werden sollten.
Bevor wir spl_autoload_unregister verwenden, müssen wir zunächst mehrere Laderypen verstehen, die möglicherweise im System registriert werden:
Anonyme Funktionen : In Verschluss definierte Lader können nicht durch einfaches Vergleich von Funktionsnamen identifiziert werden.
Benannte Funktionen/Methoden : Normalerweise ein Lader, der alleine im Projekt registriert ist, wie die Zeichenfolge "MyClass :: Load" .
Framework/Composer Autoloader : Diese Lader werden normalerweise von externen Bibliotheken oder automatisch generiert, und eine willkürliche Entfernung kann dazu führen, dass das gesamte Projekt nicht ausgeführt wird.
Verwenden Sie spl_autoload_functions , um alle aktuellen Lader aufzulisten, und die Rückgabe ist ein Array:
$autoloaders = spl_autoload_functions();
print_r($autoloaders);
Die Ausgabe kann so aussehen:
Array
(
[0] => Array
(
[0] => Composer\Autoload\ClassLoader Object
[1] => loadClass
)
[1] => 'my_autoloader_function'
)
Dieser Schritt ist sehr kritisch und kann uns helfen, festzustellen, welche Lader vom Framework oder der Bibliothek selbst registriert sind und welche unsere eigenen Lader sind.
Wenn Sie nur die Lader, die Sie selbst registriert haben, entfernen möchten, sollten Sie Ihre eigenen Lader bewusst verwalten, z. B. in Variablen speichern, wenn Sie sich für eine spätere Verwendung registrieren:
function myCustomLoader($class) {
// Ladelogik
}
spl_autoload_register('myCustomLoader');
// Wenn Sie die Zukunft stornieren müssen,Kann sich explizit davon abmelden
spl_autoload_unregister('myCustomLoader');
Vermeiden Sie Folgendes:
$loaders = spl_autoload_functions();
foreach ($loaders as $loader) {
spl_autoload_unregister($loader);
}
Dieses Schreiben beseitigt alle Lader, einschließlich Systemlader, die so wichtig sind wie Komponist.
Wenn Sie dynamisch bestimmen müssen, ob Sie Lader in Form einer Objektmethode (z. B. Komponist) entfernen möchten, können Sie sie ausschließen, indem Sie den Klassennamen des Objekts beurteilen:
$loaders = spl_autoload_functions();
foreach ($loaders as $loader) {
if (is_array($loader) && is_object($loader[0])) {
$class = get_class($loader[0]);
if ($class === 'Composer\Autoload\ClassLoader') {
// Nicht entfernen Composer Lader
continue;
}
}
spl_autoload_unregister($loader);
}
Um das Löschen anderer Lader fälschlicherweise zu vermeiden, besteht der beste Weg darin, "nur die Lader, die Sie selbst registriert haben" zu entfernen und bei der Registrierung des Laders klare Aufzeichnungen zu erstellen. Die folgenden Verwaltungsmethoden können verwendet werden:
$myLoaders = [];
$myLoaders[] = function ($class) {
require __DIR__ . '/lib/' . $class . '.php';
};
foreach ($myLoaders as $loader) {
spl_autoload_register($loader);
}
// Beim Anmelden
foreach ($myLoaders as $loader) {
spl_autoload_unregister($loader);
}
spl_autoload_unregister ist ein "zweischneidiges Schwert", das Entwicklern mehr Flexibilität verleiht, aber auch leicht zu einer möglichen Destruktivität führt. Stellen Sie bei der Verwendung sicher, dass Sie sicherstellen, welchen Lader Sie entfernt haben. Es ist am besten, wenn Sie ihn selbst registrieren. Bei System- oder Framework -Ladern, wie z. B. Klassen, die über den Komponisten geladen werden, sollte es nicht leicht entfernt werden.
Denken Sie immer daran, dass ein klares, klares und kontrollierbares automatisches Lastmanagement der Eckpfeiler des Aufbaus robuster PHP -Anwendungen ist.
Weitere Informationen zu Composer Loader finden Sie in der offiziellen Dokumentation oder dem Quellcode: https://gitbox.net/composer