Dans PHP, SPL_autoload_register fournit un mécanisme puissant pour enregistrer dynamiquement les fonctions AutoloAD des classes, tandis que SPL_AUTOLOAD_UNRENGISTER est utilisé pour supprimer ces chargeurs enregistrés. Cependant, l'utilisation de SPL_AUTOLOAD_UNRENGISTER incorrectement peut provoquer de graves problèmes, en particulier lorsque vous supprimez accidentellement un chargeur qui n'aurait pas dû être annulé, le mécanisme de mise en œuvre de l'ensemble de l'ensemble peut être compromis.
Cet article expliquera comment identifier soigneusement et éviter de supprimer les chargeurs qui ne doivent pas être supprimés lors de l'utilisation de SPL_autoload_unregister .
Avant d'utiliser SPL_autoload_unregister , nous devons d'abord comprendre plusieurs types de chargeurs qui peuvent être enregistrés dans le système:
Fonctions anonymes : les chargeurs définis dans les fermetures ne peuvent pas être identifiés en comparant simplement les noms de fonction.
Fonctions / méthodes nommées : généralement un chargeur enregistré par lui-même dans le projet, comme la chaîne "MyClass :: Load" .
Framework / Composer Autoloader : Ces chargeurs sont généralement générés par des bibliothèques externes ou automatiquement, et la suppression arbitraire peut entraîner l'exécution de l'ensemble du projet.
Utilisez SPL_AUTOLOAD_FUNCTIONS pour répertorier tous les chargeurs actuels, et le retour est un tableau:
$autoloaders = spl_autoload_functions();
print_r($autoloaders);
La sortie peut ressembler à ceci:
Array
(
[0] => Array
(
[0] => Composer\Autoload\ClassLoader Object
[1] => loadClass
)
[1] => 'my_autoloader_function'
)
Cette étape est très critique et peut nous aider à identifier les chargeurs enregistrés par le cadre ou la bibliothèque eux-mêmes et lesquels sont nos propres chargeurs.
Si vous souhaitez supprimer uniquement les chargeurs que vous avez enregistrés vous-même, vous devez gérer consciemment vos propres chargeurs, par exemple, enregistrez-les en variables lors de votre inscription pour une utilisation ultérieure:
function myCustomLoader($class) {
// Logique de chargement
}
spl_autoload_register('myCustomLoader');
// Si vous avez besoin d'annuler l'avenir,Peut explicitement en déconnecter
spl_autoload_unregister('myCustomLoader');
Évitez ce qui suit:
$loaders = spl_autoload_functions();
foreach ($loaders as $loader) {
spl_autoload_unregister($loader);
}
Cette écriture supprime tous les chargeurs, y compris les chargeurs de système aussi importants que le compositeur.
Si vous devez déterminer dynamiquement s'il faut supprimer les chargeurs sous la forme de la méthode de l'objet (tel que composer), vous pouvez les exclure en jugeant le nom de la classe de l'objet:
$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') {
// Ne pas supprimer Composer Chargeur
continue;
}
}
spl_autoload_unregister($loader);
}
Pour éviter de supprimer par erreur d'autres chargeurs, le meilleur moyen est de "supprimer uniquement les chargeurs que vous vous êtes enregistrés" et de clairement enregistrer les enregistrements lors de l'enregistrement du chargeur. Les méthodes de gestion suivantes peuvent être utilisées:
$myLoaders = [];
$myLoaders[] = function ($class) {
require __DIR__ . '/lib/' . $class . '.php';
};
foreach ($myLoaders as $loader) {
spl_autoload_register($loader);
}
// Lors de la déconnexion
foreach ($myLoaders as $loader) {
spl_autoload_unregister($loader);
}
spl_autoload_unregister est une "épée à double tranchant" qui donne aux développeurs plus de flexibilité, mais il conduit également facilement à une destructivité potentielle. Lorsque vous l'utilisez, assurez-vous de vous assurer du chargeur que vous avez supprimé, il est préférable que vous l'enregistrez vous-même. Pour les chargeurs de système ou de cadre, tels que les classes chargées via le compositeur, il ne doit pas être facilement supprimé.
N'oubliez pas que la gestion automatique de chargement claire, claire et contrôlable est la pierre angulaire de la construction d'applications PHP robustes.
Pour plus de détails sur le chargeur composé, veuillez vous référer à sa documentation officielle ou à son code source: https://gitbox.net/composer