PHPでは、 SPL_AUTOLOAD_REGISTERは、クラスのAutoLoAD関数を動的に登録する強力なメカニズムを提供し、 SPL_AUTOLOAD_UNREGISTERはこれらの登録ローダーを削除するために使用されます。ただし、 spl_autoload_unregisterを誤って使用すると、特にキャンセルされていないローダーを誤って削除する場合、アプリケーション全体の自動搭載メカニズムが損なわれる可能性があります。
この記事では、 SPL_AUTOLOAD_UNREGISTERを使用するときに削除すべきではないローダーを慎重に識別し、除去する方法について説明します。
SPL_AUTOLOAD_UNREGISTERを使用する前に、最初にシステムに登録される可能性のあるいくつかのローダータイプを理解する必要があります。
匿名関数:閉鎖で定義されたローダーは、単に関数名を比較することで識別できません。
名前付き関数/メソッド:通常、プロジェクトに登録されているローダー「MyClass :: Load」など。
Framework/Composer Autoloader :これらのローダーは通常、外部ライブラリまたは自動で生成され、任意の削除により、プロジェクト全体が実行されない可能性があります。
SPL_AUTOLOAD_FUNCTIONSを使用して、現在のすべてのローダーをリストすると、返品は配列です。
$autoloaders = spl_autoload_functions();
print_r($autoloaders);
出力は次のようになる場合があります:
Array
(
[0] => Array
(
[0] => Composer\Autoload\ClassLoader Object
[1] => loadClass
)
[1] => 'my_autoloader_function'
)
このステップは非常に重要であり、フレームワークまたはライブラリ自体によってどのローダーが登録されているか、どのローダーが私たち自身のローダーであるかを特定するのに役立ちます。
自分で登録したローダーのみを削除する場合は、自分のローダーを意識的に管理する必要があります。たとえば、後で使用する場合は、次のように変数を保存する必要があります。
function myCustomLoader($class) {
// ロードロジック
}
spl_autoload_register('myCustomLoader');
// 未来をキャンセルする必要がある場合,明示的にログアウトできます
spl_autoload_unregister('myCustomLoader');
以下を避けてください:
$loaders = spl_autoload_functions();
foreach ($loaders as $loader) {
spl_autoload_unregister($loader);
}
この文章は、作曲家と同じくらい重要なシステムローダーを含むすべてのローダーを削除します。
オブジェクトメソッドの形でローダーを削除するかどうか(作曲家など)を動的に判断する必要がある場合は、オブジェクトのクラス名を審査して除外できます。
$loaders = spl_autoload_functions();
foreach ($loaders as $loader) {
if (is_array($loader) && is_object($loader[0])) {
$class = get_class($loader[0]);
if ($class === 'Composer\Autoload\ClassLoader') {
// 削除しないでください Composer ローダ
continue;
}
}
spl_autoload_unregister($loader);
}
他のローダーが誤って削除されるのを避けるために、最良の方法は、「自分で登録したローダーのみを削除する」ことと、ローダーを登録するときに明確なレコードを作成することです。次の管理方法を使用できます。
$myLoaders = [];
$myLoaders[] = function ($class) {
require __DIR__ . '/lib/' . $class . '.php';
};
foreach ($myLoaders as $loader) {
spl_autoload_register($loader);
}
// ログアウトするとき
foreach ($myLoaders as $loader) {
spl_autoload_unregister($loader);
}
spl_autoload_unregisterは、開発者に柔軟性を高める「両刃の剣」ですが、潜在的な破壊性にも簡単につながります。使用するときは、削除したローダーを必ず確認してください。自分で登録すると最適です。 Composerを介してロードされたクラスなど、システムまたはフレームワークローダーの場合、簡単に削除することはできません。
明確で明確で制御可能な自動負荷管理が、堅牢なPHPアプリケーションの構築の基礎であることを常に覚えておいてください。
Composer Loaderの詳細については、公式ドキュメントまたはソースコードを参照してください: https://gitbox.net/composer