0

PCR-0の提案によると、オートローダーに必要なのはautoload()関数だけです。Zendにはいくつかの自動読み込みクラスがあります

Zend_Loader()
Zend_Loader_Autoloader()
Zend_Loader_Autoloader_Resource()
Zend_Loader_Autoloader_Interface()

フレームワークであるため、これらすべてのクラスがあると思います。そのため、独自のクラスと、開発者が追加する可能性があり、独自のオートローダーを持たないライブラリのライブラリクラスをロードする必要があります。

私はライブラリを持っています(フレームワークではなく通常のライブラリ)。現在、オートローダーがないため、ZendのZend_Loader_Autoloader_Resource-> addResourceType()を使用します。そのためにオートローダーを作成した場合、どのオートローダーが使用されますか:Zendまたはライブラリ?Zendのような複雑なオートローダー、またはPCR-0の例のような単純なオートローダーを実装する必要がありますか。

これらの場合に何が起こりますか

  • フレームワークとライブラリの両方に独自のオートローダーがあります
  • フレームワークにはオートローダーがありますが、ライブラリにはありません
  • フレームワークにはオートローダーがなく、ライブラリには
4

2 に答える 2

2

ダイレクト パス -> クラス マッピングに固執し、次のように独自のオートローダーを実装することをお勧めします。

class MyLib_Autoloader
{
    public function __construct() {
        spl_autoload_register(array($this, 'autoload'));
    }
    public function autoload($className)
    {
        if (substr($className, 0, 6) == 'MyLib_') {
            include dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR strtr($className, '_', DIRECTORY_SEPARATOR) . '.php';
            return true;
        } 
        return false;
    }
}

これにより、クラスが名前空間からのものであるかどうかがチェックされ、ファイルがロードされます。オートローダーが /some/path/MyLib/ にあると仮定します -> インクルード パスは /some/path/MyLib/../MyLib/ClassName.php になります。クラス名から最初の MyLib を取り除き、その '..' を取り除くロジックを追加することもできます。

のみを使用してくださいrequire。より高速で、オートロード関数は各クラス名に対して複数回呼び出されることはありません! :) include_once/require_once/etc は必要ありません。最速で行く。

使い方は次のように簡単です。

include '/some/path/MyLib/Autploader.php';
$loader = new MyLib_Autoloader();
于 2011-06-05T23:51:23.530 に答える
1

主な質問は次のとおりです。あなたのライブラリは誰/どのように使用されますか?

それがあなただけの場合は、Zend のオートローダーを使用してください。これにより、時間を節約できます。車輪を再発明する必要はありません。

ライブラリを公開して別のプロジェクトで使用する必要がある場合は、ライブラリのユーザーにも Zend Framework が必要になるため、問題になる可能性があります。その場合、独自のオートローダーを作成するか、フレームワーク/ライブラリのいずれかを選択してライブラリに含めます (ライセンスに注意してください)。

オートローダの使用について: 登録されているオートローダのみが呼び出されます。独自のオートローダを持っていても、ドキュメントでそのセットアップ方法について言及していない場合、コードのユーザーはそれをセットアップすることを決して考えず、使用されません。

したがって、基本的な答えは次のとおりです。多くのオートローダーを使用し、それらをすべて登録すると、すべてが呼び出され、すべてが正常に機能します。しかし、それは競合につながる可能性があります。なぜなら、あるオートローダーが別のオートローダーによって処理されるはずのものをロードしようとするためです。

于 2011-06-05T00:19:06.200 に答える