現在の位置: ホーム> 最新記事一覧> Autoloaderの競合を解決するためのヒント:SPL_AUTOLOAD_UNREGISTERとSPL_AUTOLOAD_REGISTERを組み合わせます

Autoloaderの競合を解決するためのヒント:SPL_AUTOLOAD_UNREGISTERとSPL_AUTOLOAD_REGISTERを組み合わせます

gitbox 2025-05-26

自動ローダー競合の典型的なシナリオ

複数のサードパーティライブラリまたはフレームワークをプロジェクトに紹介します。それぞれが独自のオートローダーを定義しています。

 spl_autoload_register(function ($class) {
    // 最初のオートローダー,プロジェクトの読み込みを担当するクラス
    $file = __DIR__ . '/src/' . str_replace('\\', '/', $class) . '.php';
    if (file_exists($file)) {
        require_once $file;
    }
});

spl_autoload_register(function ($class) {
    // 2番目のオートローダー,サードパーティライブラリをロードするクラス
    $file = __DIR__ . '/vendor/' . str_replace('\\', '/', $class) . '.php';
    if (file_exists($file)) {
        require_once $file;
    }
});

これらの2つのオートローダーは、通常は通常動作するクラスファイルをロードしようとするためにPHPによって順番に呼び出されます。ただし、例外やデッドループのスローなど、自動ローダーのロードロジックに問題がある場合、後続のローダーが実行できず、競合を引き起こします。


spl_autoload_unregisterとspl_autoload_registerの役割

  • SPL_AUTOLOAD_REGISTER :AutoLoadキューに新しいAutoLoad関数を登録します。現在のAutoLOAD関数リストの最後に追加されます。

  • SPL_AUTOLOAD_UNREGISTER :AutoLoadキューから指定されたAutoLoAD関数からログアウトして、関数が呼び出されないようにします。

これら2つの機能を通じて、競合を回避するためにオートローダーを選択的に有効または無効にすることができます。


実用的な戦闘:競合を回避するために自動ローダーを動的に切り替える

オートローダーが他のオートローダーと競合すると仮定すると、電話をかける前にログアウトして、呼び出し後に登録できます。

 // 定义最初のオートローダー
$loader1 = function ($class) {
    $file = __DIR__ . '/src/' . str_replace('\\', '/', $class) . '.php';
    if (file_exists($file)) {
        require_once $file;
    }
};

// 定义2番目のオートローダー
$loader2 = function ($class) {
    $file = __DIR__ . '/vendor/' . str_replace('\\', '/', $class) . '.php';
    if (file_exists($file)) {
        require_once $file;
    }
};

// 2つのオートローダーを登録します
spl_autoload_register($loader1);
spl_autoload_register($loader2);

// 特定のコードが実行されたとき,我们暂时注销2番目のオートローダー,競合を避けてください
spl_autoload_unregister($loader2);

// 这里执行只依赖最初のオートローダー的代码
$obj = new SomeClassFromSrc();

// 実行が完了します,重新注册2番目のオートローダー
spl_autoload_register($loader2);

// 後続のコードは、2つのオートローダーを引き続き使用できます
$obj2 = new SomeClassFromVendor();

これの利点は、自動ローダーの開始と停止を柔軟に制御して、実行中の競合によって引き起こされる問題を同時に回避することです。


要約します

自動ローダーの競合は、マルチオートロード環境でより一般的です。 PHPのspl_autoload_unregisterおよびspl_autoload_register関数を使用して、自動ローダーのイネーブルメントステータスを柔軟に動的に管理して、異なるモジュールのロードロジックが互いに干渉しないようにすることができます。

実際の開発で同様の問題に遭遇した場合、上記のアイデアを試して、コードがスムーズにロードされるようにすることもできます。


 // サンプルコード
$loader1 = function ($class) {
    $file = __DIR__ . '/src/' . str_replace('\\', '/', $class) . '.php';
    if (file_exists($file)) {
        require_once $file;
    }
};

$loader2 = function ($class) {
    $file = __DIR__ . '/vendor/' . str_replace('\\', '/', $class) . '.php';
    if (file_exists($file)) {
        require_once $file;
    }
};

spl_autoload_register($loader1);
spl_autoload_register($loader2);

// 需要只使用最初のオートローダー时
spl_autoload_unregister($loader2);

$obj = new SomeClassFromSrc();

spl_autoload_register($loader2);

$obj2 = new SomeClassFromVendor();