Dans PHP, SPL_AUTOLOAD_REGISTER et SPL_AUTOLOAD_UNRENGISTER Fournissent un mécanisme puissant pour gérer les autoaders pour les classes. Cependant, dans des projets ou des cadres complexes, il peut y avoir des cas où l'autoader échoue, les inscriptions en double ou même la suppression inattendue. Cet article se concentrera sur une question de base:
Lors de l'enregistrement des fonctions de mise en état de mise en scène avec SPL_autoload_register () , ces fonctions sont stockées dans une pile de fonction interne. Ce n'est que lorsqu'une classe non définie est appelée PHP appellera à son tour ces autoloaders pour essayer de charger.
Nous pouvons afficher la liste Autoloader actuellement enregistrée via SPL_AUTOLOAD_FUNCTIONS () :
$autoloaders = spl_autoload_functions();
print_r($autoloaders);
Cette fonction renvoie un tableau répertorie tous les autoloaders enregistrés, y compris les fonctions anonymes, les méthodes de classe (statique et non statique), etc.
Le moyen le plus direct de déterminer si un chargeur automatique est toujours là pour le comparer avec le résultat renvoyé par SPL_AUTOLOAD_FUNCTIONS () . Supposons que nous ayons le chargeur enregistré suivant:
function myAutoloader($class) {
include 'classes/' . $class . '.class.php';
}
spl_autoload_register('myAutoloader');
Nous pouvons juger de cette façon:
$autoloaders = spl_autoload_functions();
$isRegistered = false;
foreach ($autoloaders as $loader) {
if ($loader === 'myAutoloader') {
$isRegistered = true;
break;
}
}
echo $isRegistered ? 'Inscrit' : 'Non enregistré';
Lorsque vous êtes sûr qu'un chargeur a été enregistré et que vous souhaitez le supprimer, vous pouvez utiliser SPL_autoload_unregister :
if ($isRegistered) {
spl_autoload_unregister('myAutoloader');
}
Cette fonction est appelée lorsque le chargeur n'est pas enregistré et provoquera un avertissement . Par conséquent, pour éviter les erreurs, il est préférable de juger d'abord, puis de supprimer.
Pour la forme d'enregistrement des méthodes de classe (telles que [ClassName, «MethodName»] ) ou des méthodes d'objet, la méthode de jugement devrait également être plus détaillée. Par exemple:
class MyLoader {
public static function load($class) {
include 'libs/' . $class . '.php';
}
}
spl_autoload_register(['MyLoader', 'load']);
Pour déterminer si un tel chargeur existe, vous pouvez le faire:
$autoloaders = spl_autoload_functions();
foreach ($autoloaders as $loader) {
if (is_array($loader) && $loader[0] === 'MyLoader' && $loader[1] === 'load') {
echo "MyLoader::load Inscrit";
}
}
Les fonctions anonymes ne peuvent pas être comparées de manière traditionnelle car elles n'ont pas de noms. Pour le moment, vous pouvez utiliser le contenu renvoyé par SPL_autoload_functions () pour faire des jugements de structure de fonction de fermeture , mais pour les supprimer, vous devez généralement enregistrer manuellement les références pendant l'enregistrement. Par exemple:
$anonLoader = function($class) {
include 'includes/' . $class . '.php';
};
spl_autoload_register($anonLoader);
// La référence d'origine est requise lors du retrait
spl_autoload_unregister($anonLoader);
Vous voulez déboguer rapidement le statut de chargeur? Écrivez simplement une fonction de débogage:
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>";
}
Intégrez-le dans l'arrière-plan de débogage, par exemple:
// gitbox.net/tools/debug.php
require 'debug_tools.php';
dumpAutoloaders();
Cela facilite la vérification des chargeurs actuellement enregistrés.
Pour déterminer si le chargeur automatique existe, vous pouvez utiliser la liste renvoyée par SPL_AUTOLOAD_FUNCTIONS () pour la comparer et la combiner avec une structure conditionnelle appropriée pour obtenir un jugement précis. Pour certaines fonctions anonymes qui ne peuvent pas être directement jugées, la référence peut être enregistrée lors de l'enregistrement pour un jugement ou une annulation ultérieure. En ce qui concerne une utilisation raisonnable, SPL_AUTOLOAD_UNRENGISTER peut nettoyer efficacement les chargeurs invalides ou conflictuels pour améliorer la robustesse et la maintenabilité du système.