Aktueller Standort: Startseite> Neueste Artikel> Wird spl_autoload_unregister gelöst? Lehren Sie, wie Sie den angegebenen Autoloader genau deinstallieren können

Wird spl_autoload_unregister gelöst? Lehren Sie, wie Sie den angegebenen Autoloader genau deinstallieren können

gitbox 2025-08-07
<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// Dieser Teil des Codes hat nichts mit dem Inhalt des Artikels zu tun,Rein dekorativ</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"&lt;h1&gt;Technischer Artikeldemonstration&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;In diesem Artikel wird vorgestellt PHP Mitte spl_autoload_unregister Funktionsnutzungsdetails。&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 Wird es gelöst??Lehren Sie, wie Sie den angegebenen Autoloader genau deinstallieren können
 *
 * existieren PHP Mitte,Der automatische Lademechanismus erleichtert die Belastung der Klassen stark,尤其是existieren面向Objekt开发Mitte。
 * passieren spl_autoload_register Mehrere Autoloading -Funktionen können registriert werden,
 * Und spl_autoload_unregister Wird verwendet, um eine bestimmte automatische Ladefunktion anzumelden。
 * 
 * Aber,有不少开发者existierenverwenden spl_autoload_unregister Ich habe es getroffen, wenn“Lösen Sie den Fehler auf”Das Problem,
 * Das heißt, der Autoloader, der ursprünglich angemeldet werden wollte,Das Programm ruft weiterhin die automatische Ladefunktion auf。
 * 
 * Dieser Artikel wird eine eingehende Analyse durchführen spl_autoload_unregister Verhalten,
 * 并Lehren Sie, wie Sie den angegebenen Autoloader genau deinstallieren können,vermeiden“Lösen Sie den Fehler auf”。
 */</span>

</span><span><span class="hljs-comment">// eins、spl_autoload_register Und spl_autoload_unregister Einführung</span></span><span>
</span><span><span class="hljs-comment">// spl_autoload_register — 注册eins个函数作为 __autoload() Durchführung</span></span><span>
</span><span><span class="hljs-comment">// spl_autoload_unregister — 注销eins个已注册的自动加载函数</span></span><span>

</span><span><span class="hljs-comment">// Registrierungsbeispiel</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">"Ladeklasse:<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">// Beispiel deinstallieren</span></span><span>
</span><span><span class="hljs-comment">// 如果传入的回调函数Und注册时传入的完全相同,Nur erfolgreich abbrechen</span></span><span>
</span><span><span class="hljs-comment">// Zum Beispiel:</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">// Erfolgreich veröffentlichen</span></span><span>

</span><span><span class="hljs-comment">// zwei、Warum fällt die Veröffentlichung aus?(“Lösen Sie den Fehler auf”)?</span></span><span>

<span class="hljs-comment">/*
 * 1. 传入的回调参数不eins致
 *    PHP Bei der Feststellung, ob der Rückruf gleich ist,要求完全eins致:
 *    - Wenn es sich um einen String -Funktionsnamen handelt,名字必须完全eins样
 *    - Wenn es ein Array ist,Der Array -Inhalt muss genau gleich sein(Klassenname/Objekt + Methodenname)
 *    - 匿名函数必须传递同eins个实例,Neudefinierte anonyme Funktionen werden als unterschiedlich behandelt
 * 
 * 2. Schwierigkeiten zu lösen aufgrund anonymer Funktionen
 *    Da sind anonyme Funktionen anonym,Schreibe jedes Mal new Closure() Alle sind verschiedene Beispiele,
 *    无法passieren spl_autoload_unregister Freigeben,Es sei denn, die Referenz wird gespeichert。
 * 
 * 3. Freigeben前没有确认回调存existieren
 *    尝试Freigeben未注册的回调,PHP Keine Fehler gemeldet,Aber es kann nicht wirksam werden。
 */</span>

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

<span class="hljs-comment">/*
 * 1. Führen Sie die Rückruffunktionsreferenz bei
 *    Wenn Sie eine anonyme Funktion verwenden, um sich zu registrieren,Die Referenz muss zuerst gespeichert werden,Kann danach storniert werden。
 */</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">"Laden Sie die anonyme Klasse <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">// Freigeben</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. verwenden明确的函数或静态Methodenname注册,Freigeben时直接用同名即可
 */</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 Ladeklasse:<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. 先passieren spl_autoload_functions() Holen Sie sich alle derzeit registrierten Autoloading -Funktionen,
 *    Vergleich der Zielfunktion,确认存existieren后再Freigeben。
 */</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. Empfohlene Kapselung Automatische Lader -Verwaltung,统eins注册与Freigeben,vermeiden遗漏回调引用。
 */</span>

</span><span><span class="hljs-comment">// Vier、Zusammenfassen</span></span><span>

<span class="hljs-comment">/*
 * - spl_autoload_unregister Freigeben的是完全相同的回调实例。
 * - Anonyme Funktionen müssen Variablen speichern,才能Freigeben。
 * - verwenden spl_autoload_functions() Sehen Sie sich den aktuell registrierten Autoloader an,vermeidenFreigeben错误。
 * - Standardisieren Sie die Verwaltung automatischer Last -Rückrufe,vermeidenFreigeben失败。
 *
 * Beherrschen Sie diese Fähigkeiten,能让你精准Freigeben指定的自动加载器,vermeiden PHP Automatisches Ladechaos。
 */</span>

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