Position actuelle: Accueil> Derniers articles> SPL_autoload_unregister sera-t-il résolu? Apprenez à désinstaller avec précision l'autoloder spécifié

SPL_autoload_unregister sera-t-il résolu? Apprenez à désinstaller avec précision l'autoloder spécifié

gitbox 2025-08-07
<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// Cette partie du code n&#39;a rien à voir avec le contenu de l&#39;article,Pur décoratif</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"&lt;h1&gt;Démonstration d&#39;article technique&lt;/h1&gt;"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"&lt;p&gt;Cet article présente PHP milieu spl_autoload_unregister Détails d&#39;utilisation des fonctions。&lt;/p&gt;"</span></span><span>;
</span><span><span class="hljs-meta">?&gt;</span></span><span>

&lt;hr&gt;

</span><span><span class="hljs-meta">&lt;?php</span></span><span>
<span class="hljs-comment">/*
 * spl_autoload_unregister Sera-t-il résolu??Apprenez à désinstaller avec précision l&#39;autoloder spécifié
 *
 * exister PHP milieu,Le mécanisme de chargement automatique facilite considérablement le chargement des classes,尤其是exister面向Objet开发milieu。
 * passer spl_autoload_register Plusieurs fonctions de mise à jour peuvent être enregistrées,
 * et spl_autoload_unregister Utilisé pour déconnecter une certaine fonction de chargement automatique。
 * 
 * mais,有不少开发者existerutiliser spl_autoload_unregister Je l&#39;ai rencontré quand“Résoudre l&#39;erreur”Le problème,
 * C&#39;est-à-dire que l&#39;autoloader qui voulait à l&#39;origine être déconnecté n&#39;a pas été correctement libéré,Le programme appelle toujours la fonction de chargement automatique。
 * 
 * Cet article effectuera une analyse approfondie spl_autoload_unregister Comportement,
 * 并Apprenez à désinstaller avec précision l&#39;autoloder spécifié,éviter“Résoudre l&#39;erreur”。
 */</span>

</span><span><span class="hljs-comment">// un、spl_autoload_register et spl_autoload_unregister Introduction</span></span><span>
</span><span><span class="hljs-comment">// spl_autoload_register — 注册un个函数作为 __autoload() Mise en œuvre</span></span><span>
</span><span><span class="hljs-comment">// spl_autoload_unregister — 注销un个已注册的自动加载函数</span></span><span>

</span><span><span class="hljs-comment">// Exemple d&#39;inscription</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">my_autoload</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$className</span></span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Classe de chargement:<span class="hljs-subst">$className</span></span></span><span>\n";
}
</span><span><span class="hljs-title function_ invoke__">spl_autoload_register</span></span><span>(</span><span><span class="hljs-string">'my_autoload'</span></span><span>);

</span><span><span class="hljs-comment">// Exemple de désinstallation</span></span><span>
</span><span><span class="hljs-comment">// 如果传入的回调函数et注册时传入的完全相同,Seulement annulé avec succès</span></span><span>
</span><span><span class="hljs-comment">// Par exemple:</span></span><span>
</span><span><span class="hljs-title function_ invoke__">spl_autoload_unregister</span></span><span>(</span><span><span class="hljs-string">'my_autoload'</span></span><span>); </span><span><span class="hljs-comment">// Libérer le succès</span></span><span>

</span><span><span class="hljs-comment">// deux、Pourquoi la version échoue-t-elle(“Résoudre l&#39;erreur”)?</span></span><span>

<span class="hljs-comment">/*
 * 1. 传入的回调参数不un致
 *    PHP Lors de la détermination de si le rappel est le même,要求完全un致:
 *    - S&#39;il s&#39;agit d&#39;un nom de fonction de chaîne,名字必须完全un样
 *    - Si c&#39;est un tableau,Le contenu du tableau doit être exactement le même(Nom de classe/Objet + Nom de méthode)
 *    - 匿名函数必须传递同un个实例,Les fonctions anonymes redéfinies sont traitées comme différentes
 * 
 * 2. Difficulté à résoudre en raison de fonctions anonymes
 *    Puisque les fonctions anonymes sont anonymes,Écrire à chaque fois new Closure() Tous sont des exemples différents,
 *    无法passer spl_autoload_unregister Libérer,À moins que la référence ne soit enregistrée。
 * 
 * 3. Libérer前没有确认回调存exister
 *    尝试Libérer未注册的回调,PHP Aucune erreur signalée,Mais ça ne peut pas prendre effet。
 */</span>

</span><span><span class="hljs-comment">// trois、如何精准Libérer指定的自动加载器?</span></span><span>

<span class="hljs-comment">/*
 * 1. Gardez la référence de la fonction de rappel
 *    Si vous utilisez une fonction anonyme pour vous inscrire,La référence doit être enregistrée en premier,Peut être annulé après。
 */</span>
</span><span><span class="hljs-variable">$loader</span></span><span> = </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$class</span></span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Chargez une classe anonyme <span class="hljs-subst">$class</span></span></span><span>\n";
};
</span><span><span class="hljs-title function_ invoke__">spl_autoload_register</span></span><span>(</span><span><span class="hljs-variable">$loader</span></span><span>);
</span><span><span class="hljs-comment">// Libérer</span></span><span>
</span><span><span class="hljs-title function_ invoke__">spl_autoload_unregister</span></span><span>(</span><span><span class="hljs-variable">$loader</span></span><span>);

<span class="hljs-comment">/*
 * 2. utiliser明确的函数或静态Nom de méthode注册,Libérer时直接用同名即可
 */</span>
</span><span><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span> </span><span><span class="hljs-title">Loader</span></span><span> {
    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-built_in">static</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">load</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$class</span></span></span><span>) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Loader Classe de chargement:<span class="hljs-subst">$class</span></span></span><span>\n";
    }
}
</span><span><span class="hljs-title function_ invoke__">spl_autoload_register</span></span><span>([</span><span><span class="hljs-string">'Loader'</span></span><span>, </span><span><span class="hljs-string">'load'</span></span><span>]);
</span><span><span class="hljs-title function_ invoke__">spl_autoload_unregister</span></span><span>([</span><span><span class="hljs-string">'Loader'</span></span><span>, </span><span><span class="hljs-string">'load'</span></span><span>]);

<span class="hljs-comment">/*
 * 3. 先passer spl_autoload_functions() Obtenez toutes les fonctions de mise à jour actuellement enregistrées,
 *    Comparaison de la fonction cible,确认存exister后再Libérer。
 */</span>
</span><span><span class="hljs-variable">$registered</span></span><span> = </span><span><span class="hljs-title function_ invoke__">spl_autoload_functions</span></span><span>();
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$registered</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$callback</span></span><span>) {
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$callback</span></span><span> === </span><span><span class="hljs-string">'my_autoload'</span></span><span>) {
        </span><span><span class="hljs-title function_ invoke__">spl_autoload_unregister</span></span><span>(</span><span><span class="hljs-string">'my_autoload'</span></span><span>);
        </span><span><span class="hljs-keyword">break</span></span><span>;
    }
}

<span class="hljs-comment">/*
 * 4. Encapsulation recommandée Gestion du chargeur automatique,统un注册与Libérer,éviter遗漏回调引用。
 */</span>

</span><span><span class="hljs-comment">// Quatre、Résumer</span></span><span>

<span class="hljs-comment">/*
 * - spl_autoload_unregister Libérer的是完全相同的回调实例。
 * - Les fonctions anonymes doivent enregistrer des variables,才能Libérer。
 * - utiliser spl_autoload_functions() Afficher l&#39;autoloader actuellement enregistré,éviterLibérer错误。
 * - Standardiser la gestion des rappels de chargement automatiques,éviterLibérer失败。
 *
 * Maître ces compétences,能让你精准Libérer指定的自动加载器,éviter PHP Chaos de chargement automatique。
 */</span>

</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>