現在の位置: ホーム> 最新記事一覧> spl_autoload_unregisterは解決されますか?指定されたオートローダーを正確にアンインストールする方法を教えてください

spl_autoload_unregisterは解決されますか?指定されたオートローダーを正確にアンインストールする方法を教えてください

gitbox 2025-08-07
<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// コードのこの部分は、記事の内容とは何の関係もありません,純粋な装飾</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"&lt;h1&gt;技術的な記事のデモンストレーション&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;この記事で紹介します PHP 真ん中 spl_autoload_unregister 関数の使用の詳細。&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 それは解決されますか??指定されたオートローダーを正確にアンインストールする方法を教えてください
 *
 * 存在する PHP 真ん中,自動荷重メカニズムは、クラスの負荷を大幅に促進します,尤其是存在する面向物体开发真ん中。
 * 合格 spl_autoload_register 複数の自動搭載関数を登録できます,
 * そして spl_autoload_unregister 特定の自動負荷関数をログアウトするために使用されます。
 * 
 * しかし,有不少开发者存在する使用 spl_autoload_unregister 私はいつ会ったか“エラーを解決します”問題,
 * つまり、もともとログアウトしたいと思っていたオートローダーは適切にリリースされていませんでした,このプログラムは、自動荷重関数を引き続き呼び出します。
 * 
 * この記事では、詳細な分析を実施します spl_autoload_unregister 行動,
 * 并指定されたオートローダーを正確にアンインストールする方法を教えてください,避ける“エラーを解決します”。
 */</span>

</span><span><span class="hljs-comment">// 1つ、spl_autoload_register そして spl_autoload_unregister 導入</span></span><span>
</span><span><span class="hljs-comment">// spl_autoload_register — 注册1つ个函数作为 __autoload() 実装</span></span><span>
</span><span><span class="hljs-comment">// spl_autoload_unregister — 注销1つ个已注册的自动加载函数</span></span><span>

</span><span><span class="hljs-comment">// 登録の例</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">"ロードクラス:<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">// アンインストール例</span></span><span>
</span><span><span class="hljs-comment">// 如果传入的回调函数そして注册时传入的完全相同,正常にキャンセルするだけです</span></span><span>
</span><span><span class="hljs-comment">// 例えば:</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">// リリース成功</span></span><span>

</span><span><span class="hljs-comment">// 二、なぜリリースが失敗するのか(“エラーを解決します”)?</span></span><span>

<span class="hljs-comment">/*
 * 1. 传入的回调参数不1つ致
 *    PHP コールバックが同じかどうかを判断するとき,要求完全1つ致:
 *    - 文字列関数名の場合,名字必须完全1つ样
 *    - それが配列の場合,配列コンテンツはまったく同じでなければなりません(クラス名/物体 + メソッド名)
 *    - 匿名函数必须传递同1つ个实例,再定義された匿名関数は、異なるものとして扱われます
 * 
 * 2. 匿名の関数のために解決するのが難しい
 *    匿名関数は匿名であるためです,毎回書く new Closure() すべてが異なる例です,
 *    无法合格 spl_autoload_unregister リリース,参照が保存されない限り。
 * 
 * 3. リリース前没有确认回调存存在する
 *    尝试リリース未注册的回调,PHP エラーは報告されていません,しかし、それは有効になりません。
 */</span>

</span><span><span class="hljs-comment">// 三つ、如何精准リリース指定的自动加载器?</span></span><span>

<span class="hljs-comment">/*
 * 1. コールバック関数の参照を保持します
 *    匿名関数を使用して登録する場合,参照は最初に保存する必要があります,その後キャンセルできます。
 */</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">"匿名クラスをロードします <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">// リリース</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. 使用明确的函数或静态メソッド名注册,リリース时直接用同名即可
 */</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 ロードクラス:<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. 先合格 spl_autoload_functions() 現在登録されているすべてのオートローディング関数を取得します,
 *    ターゲット関数の比較,确认存存在する后再リリース。
 */</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. 推奨されるカプセル化自動ローダー管理,统1つ注册与リリース,避ける遗漏回调引用。
 */</span>

</span><span><span class="hljs-comment">// 4、要約します</span></span><span>

<span class="hljs-comment">/*
 * - spl_autoload_unregister リリース的是完全相同的回调实例。
 * - 匿名関数は変数を保存する必要があります,才能リリース。
 * - 使用 spl_autoload_functions() 現在登録されているオートローダーを表示します,避けるリリース错误。
 * - 自動ロードコールバックの管理を標準化します,避けるリリース失败。
 *
 * これらのスキルを習得します,能让你精准リリース指定的自动加载器,避ける PHP 自動荷重カオス。
 */</span>

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