2011-06-04 3 views
0

PCR-0 proposalによれば、オートローダはすべてautoload()関数が必要です。フレームワークと通常のライブラリのオートローダは異なります

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

少数のオートローディングクラスを持っているZendのは、私はそれがフレームワークだから、それはすべてのこれらのクラスを持って推測しているので、開発者が追加することができます任意のライブラリを独自のクラスだけでなく、ライブラリクラスをロードする必要があると独自のオートローダを備えていません。

私はライブラリ(通常のライブラリであり、フレームワークではありません)を持っています。私はZendのZend_Loader_Autoloader_Resource - > addResourceType()を使用しているので、現在はオートローダーがありません。オートローダを作成すると、オートローダが使用されます:Zendやライブラリですか? Zendのような複雑なオートローダーや、PCR-0のようなシンプルなオートローダーを実装する必要があります。これらの場合に何が起こる

  • 両方のフレームワークやライブラリが
  • フレームワークは、オートローダーを持って、自分のオートローダーを持っていますが、ライブラリがないの
  • フレームワークは、NOオートローダーを持っていない、とライブラリが
を持って

答えて

1

主な質問は、あなたのライブラリを誰が/どのように使うのですか?

それだけであれば、Zendのオートローダーを使用すると、時間が節約できます。あなたは車輪を再構築する必要はありません。

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

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

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

2

は、私はこのような独自のオートローダを直接path->クラスマッピングへの粘着および実装することをお勧めしたい:これはクラスが名前空間からあるかどうかを確認し、ファイルをロードします

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のみを使用してください。速く、autoload関数はクラス名ごとに2回以上呼び出されません! :) include_once/require_once/etcの必要はありません。最も速く行ってください。

使い方は同じくらい簡単です:

include '/some/path/MyLib/Autploader.php'; 
$loader = new MyLib_Autoloader(); 
関連する問題