<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Cette partie du code n'a rien à voir avec le contenu de l'article,Pur décoratif</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<h1>Démonstration d'article technique</h1>"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<p>Cet article présente PHP milieu spl_autoload_unregister Détails d'utilisation des fonctions。</p>"</span></span><span>;
</span><span><span class="hljs-meta">?></span></span><span>
<hr>
</span><span><span class="hljs-meta"><?php</span></span><span>
<span class="hljs-comment">/*
* spl_autoload_unregister Sera-t-il résolu??Apprenez à désinstaller avec précision l'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'ai rencontré quand“Résoudre l'erreur”Le problème,
* C'est-à-dire que l'autoloader qui voulait à l'origine être déconnecté n'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'autoloder spécifié,éviter“Résoudre l'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'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'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'il s'agit d'un nom de fonction de chaîne,名字必须完全un样
* - Si c'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'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">?></span></span><span>
</span></span>