2012-09-13 20 views
12

Zend Framework 2(そしてZFは一般的です)を見ていきます。user guideでは、新しいモジュールを追加するときにオートロードを使用しています。しかし、私は新人にとって非常に挑戦的な説明を見つける。Zend Framework 2オートローディング

public function getAutoloaderConfig() 
    { 
     return array(
      'Zend\Loader\ClassMapAutoloader' => array(
       __DIR__ . '/autoload_classmap.php', 
      ), 
      'Zend\Loader\StandardAutoloader' => array(
       'namespaces' => array(
        __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, 
       ), 
      ), 
     ); 
    } 

は今、私はいくつか試してみて、この自動読み込みがすべてに約あるかを把握するために周りに掘った:彼らは、とりわけ、以下のコードを含むモジュールディレクトリ内Module.phpファイルを、追加しています。私が理解する限り、オートローディングはspl_autoload_register()を使用しており、コード内のどこでもrequire_once()を避ける方法です。したがって、定義されていないクラスを使用しようとすると、登録されたメソッドautoload()が実行されます。これは単に配列検索を行い、追加された場合は以下のようなファイルを含みます。

// Zend/Loader/ClassMapAutoloader.php 
public function autoload($class) 
{ 
    if (isset($this->map[$class])) { 
     require_once $this->map[$class]; 
    } 
} 

これはパフォーマンスのために賢いようです。私が書いたものが正しいことを願っています。これに基づいて、私はgetAutoloaderConfig()の最初のコードスニペットから何が起こっているのか把握しようとしていますが、私はかなり混乱しています。これは、このメソッドによって返される配列がAutoloaderFactory::factory()に使用されているようですが、どのような目的がわかりません。オートローダのオプションをインスタンシエートすることは可能ですが、正確にはそれはわかりません。私は配列の2番目のエントリは、モジュールの名前空間のソースファイルを見つける場所を指定していると思います。少なくとも、それは私の推測です。しかし、最初のエントリーはわかりません。ユーザーガイドでは、次の言葉:

我々が開発しているように、私たちは私たちは、クラスマップのオートローダーのための空の配列を提供 、クラスマップ経由Fiのレをロードする必要はありません。

ファイルは空の配列を返します。私はこのClassMapAutoloaderの目的がわからない。

申し訳ありませんが、私のポイントは不明です。基本的に私はgetAutoloaderConfig()で何が起こっているのか把握しようとしていて、何のためにmymodule/autoload_classmap.phpが使用されています。もし誰かがこれについていくつかの光を当てることができれば、それは非常に高く評価されるでしょう!

+8

Zendはそんなにうまく設計されていません。 – wesside

+1

絶対に。しかし、私はあなたの周りにあなたの道を見つけると、それは実際には本当に強力だと思う。 Magentoのように。 –

+0

私は職場で使っていますが、それは起伏です。私はKohanaを好むが、私が必要とするかもしれないZend Librariesを使う。申し訳ありません@ andy124、まだ2を使用していません、あなたの質問をハイジャックして申し訳ありません。 – wesside

答えて

21

クラスマップは、PHPをクラスに最も直接的に表示するためのものです。

PHPは全体オートローダチェーンを介して実行する必要があり、それがなければ
return array(
    'A\Class\Youre\Looking\For' => ___DIR__.'/xyz.php' 
) 

、とすることができる:。xyz.phpこれは、このように表現されるだろう:それは本質的にあなたがあなたがA\Class\Youre\Looking\For探している、このファイルよりもう探す必要はありません」と言っていますクラスマップファイルは通常、プロダクションサーバー上でスクリプトによって生成されるため、実際にはあまりにも多くのことを心配する必要はありません。 ...

getAutoloaderConfig()メソッドは、実際に高度なアプリケーションに柔軟性を与えるためのものです。ほとんどの場合、Skeleto nApplicationとSkeletonModuleのボイラープレートコードをそのまま残しておきます。本当に、あなたは今でも'Zend\Loader\ClassMapAutoloader' => array(__DIR__ . '/autoload_classmap.php',)の部分を殺すことさえできます。

これは、ZF2(私のような)から始めるのであれば、将来の改善のためのフックであり、あまり心配することはありません。

+0

ありがとうございます。あなたの例では、ClassMapAutoloaderについて書いたことは意味がありますが、配列のキーが 'Zend \ Loader \ ClassMapAutoloader'である理由はわかりません。値はクラスでもないPHPファイルを参照します。配列を返します。私の推測では、 'ClassMapAutoloader'に、クラスマップの設定のためにそのファイルを見るように指示していることでしょう。私は今それを使うつもりはありませんが、 'autoload_classmap.php'の目的は、クラス名の配列をキーとして、パスを値として返すことです。あなたの答えからわかるように、これは必ずしも最適化ではありません。 – Andy0708

+1

Zend \ Loader \ ClassMapAutoloaderはクラスです。 https://github.com/zendframework/zf2/blob/master/library/Zend/Loader/ClassMapAutoloader.php を参照してください。「ClassMapAutoloaderを使用して、パラメータとしてautoload_classmap.phpを渡してください」と言っています。オートローダは、そのファイルから返された配列を使用して、クラスを特定のファイルにマップします。 これは少し明確ですか? –

8

ZF2には多数のオートローダーがあります。

2つの最も一般的な(または2つの開発者がどんなレートで直接相互作用するか)は、Zend\Loader\ClassMapAutoloaderZend\Loader\StandardAutoloaderです。

  1. クラスマップオートローダは通常 に、モジュールレベルで使用される単純だが高速アレイルックアップメカニズムを提供します。 は、クラスを表す のキーと、そのクラスを定義するファイル名 を表す値を持つkey => valueというペアの連想配列で構成されています。

  2. 一方、標準オートローダーは、 の「名前空間」とベースディレクトリのリストを保持するように設計されています。次に、 は、 という名前のクラスのベースディレクトリパスをクラス の名前に先行させ、クラスファイルへの最終絶対パスに到達するために、 によって参照されるクラスへのパスを構築します。 それが含まれようとします。 /path/to/ZF2/bin/classmap_generator.phpまたはzftool.phar クラスマップを実行して、 classmap_autoload.phpファイルにすばやく入力できます。

Zend\Loader\AutoloaderFactoryは、さまざまなオートローダーを管理し、競合がないことを確認するように設計されています。最終的には、もちろん、すべての自動ロード機能はPHP SPLオートローディングを活用します。

getAutoloaderConfig()の目的は、オートローダファクトリに、このモジュールのネームスペースで使用可能なオートローダを特定することです。

上記の例では、クラスマップオートローダーの後に標準オートローダーが続くことが優先されます。そのモジュールにクラスマップオートローダーを使用しない場合は、getAutoloaderConfig()が返す配列から単純に参照を削除してください。

メソッド名getAutoloaderConfig()は予約されています。このメソッドが定義されている場合、モジュールの初期化プロセス中に、このメソッドから返された構成を取得して統合された構成に追加するリスナー(Zend\ModuleManager\AutoloaderListener)が添付されます。

+0

+1非常に明確で簡単な説明。 – Andy0708

3

Webアプリケーションは多くのPHPクラスで構成され、それぞれのクラスは通常、別々のファイルにあります。 これにより、ファイルを含むの必要性が に導入されます。

アプリケーションのサイズが大きくなると、必要なファイルがそれぞれ になることがあります。 Zend Framework 2自体は何百ものファイル、 で構成されており、ライブラリ全体とそのすべての 依存関係をこのようにロードするのは非常に困難です。さらに、結果のコードを実行すると、 は、そのクラスの インスタンスを作成しなくても、各包含ファイルを処理するためにCPU時間を要します。

この問題を修正するため、PHP 5.1では、クラスのオートローディング機能が導入されました。 PHP関数spl_autoload_register()は、 オートローダ関数を登録することができます。複雑なWebサイトの場合は、 オートローダ機能を複数作成することもできます。オートローダ機能はスタックにチェーンされています。スクリプトの実行中に

、PHPインタプリタはまだ定義されていないクラス名 が発生した場合、どちらかのオートローダー関数はクラスを含むか、または「見つかりません」というエラーが になるまで、それは、順番に すべての登録オートローダ機能を呼び出します育った。これは、PHPインタプリタがクラス呼び出しの瞬間にクラス 定義を処理するときに、実際に必要とされるときに、「遅延」ロードを可能にします。かなり迷惑であるあなたは、各依存ライブラリごとに異なるカスタムオートローダー関数を登録する必要があります

各ライブラリのベンダーが独自のコードのネーミングとファイル編成の規則を使用しているため、 、 (そして実際にこれは不要な作業です)。この問題を解決するために、 PSR-0標準が導入されました。

PSR-0 standard (PSRは、PHP標準勧告の略) は、アプリケーションやライブラリは、オートローダーの相互運用性を保証するために に従わなければならない推奨コードの構造を定義します。

ウェブアプリケーションの各モジュールはオートローダを登録します。これにより、 モジュール内の任意のPHPクラスが自動ロードされます。これはModuleクラスのgetAutoloaderConfig()メソッドで行われます。標準オートローダー(Zend\Loader\StandardAutoloader) とクラスマップオートローダ(Zend\Loader\ClassMapAutoloader):

ZF2は、二つの一般的に使用されるオートローダクラスの実装 が含まZend\Loaderという名前の特別な成分を有しています。

ZF2ベースのアプリケーションモジュールがPSR-0規格に準拠しているため、標準のオートローダーを使用することができます。

クラスマップオートローダーは、標準オートローダーのより速い交換用として使用できます。 このオートローダーは、クラスマップ配列を渡すことを期待しています。各キー=>値クラス マップのペアは、クラスを含むPHPファイルのクラス名とパスです。

Zend Framework 2のオートロードの概念は、Using Zend Framework 2の本でよく説明されています。

関連する問題