Position actuelle: Accueil> Derniers articles> Comment déterminer si l'autoloader a été enregistré: l'application de SPL_autoload_unregister

Comment déterminer si l'autoloader a été enregistré: l'application de SPL_autoload_unregister

gitbox 2025-06-04

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:

Mécanisme de base du chargeur automatique

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.

Déterminez si le chargeur automatique est toujours là

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é';

Utilisez SPL_AUTOLOAD_UNRENGISTER pour supprimer en toute sécurité les chargeurs

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.

Méthode de classe comme moyen de juger un chargeur

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";
    }
}

Faire face à l'enregistrement des fonctions anonymes

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);

Conseils: Sortie toutes les informations de chargeur actuelles

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.

Résumer

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.