12

私は Zend Framework 2 を調べ始めたばかりです (そして一般的に ZF は初めてです)。ユーザー ガイドでは、新しいモジュールを追加するときにオートローディングを使用しています。ただ、新人にはかなり難しい説明だと思います。Module.phpモジュールディレクトリ内にファイルを追加しています。これには、特に次のコードが含まれています。

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

ここで、このオートローディングが何であるかを理解しようと、いろいろ調べてみました。私が理解している限り、オートローディングは、コード内のどこにでもある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 番目のエントリは、モジュールの名前空間のソース ファイルを見つける場所を指定していると思います - 少なくともそれは私の推測です。ただし、最初のエントリはよくわかりません。ユーザーガイドには、次のように記載されています。

開発中のため、クラスマップを介してファイルをロードする必要がないため、クラスマップ オートローダーに空の配列を提供します。

ファイルは空の配列を返すだけです。この ClassMapAutoloader の目的がわかりません。

私の言いたいことがはっきりしない場合は申し訳ありません。基本的に私は何が起こっているのか、何のために使われているのかを理解しようとしていgetAutoloaderConfig()ますmymodule/autoload_classmap.php. 誰かがこれに光を当てることができれば、それは大歓迎です!

4

3 に答える 3

21

クラスマップは、PHP からクラスへの最も直接的な方法を示すためにあります。本質的には、「あなたが探しているのはA\Class\Youre\Looking\For、このファイル以外を探す必要はありません: xyz.php. これは次のように表現されます:

return array(
    'A\Class\Youre\Looking\For' => ___DIR__.'/xyz.php'
)

これがないと、PHP はオートローダー チェーン全体を実行する必要があり、かなりコストがかかる可能性があります。「私たちは開発中です」と言っているのはなぜですか?クラスマップ ファイルは通常、スクリプトによって実稼働サーバー上で生成されるためです。基本的に、今はあまり気にしないでください。それはマイクロ最適化です...

このgetAutoloaderConfig()方法は、本当に高度なアプリケーションである程度の柔軟性を提供するためのものです。ほとんどの場合、SkeletonApplication と SkeletonModule のボイラープレート コードをそのまま使用できます。'Zend\Loader\ClassMapAutoloader' => array(__DIR__ . '/autoload_classmap.php',)本当に、今のところその部分を殺すことさえできます.

これは将来の改善のための単なるフックであり、ZF2 を使い始めたばかりの場合 (私のように ;) あまり心配する必要はありません。

于 2012-09-13T22:39:16.513 に答える
8

ZF2 には、多数のオートローダーが用意されています。

最も一般的な 2 つ (または、いずれにせよ開発者が直接やり取りする 2 つ) はZend\Loader\ClassMapAutoloaderZend\Loader\StandardAutoloaderです。

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

  2. 一方、標準のオートローダは、「名前空間」とベース ディレクトリのリストを保持するように設計されています。次に、その名前空間のベース ディレクトリ パスをクラス名の先頭に追加することで、参照されているがまだロードされていないクラスへのパスを作成し、クラス ファイルへの最終的な絶対パスに到達します。含む。/path/to/ZF2/bin/classmap_generator.phpいずれかを実行するか、クラスマップを生成することにより、classmap_autoload.php ファイルをすばやく zftool.phar作成できます。

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

の目的はgetAutoloaderConfig()、オートローダー ファクトリに対して、このモジュールの名前空間で使用できるオートローダーを特定することです。

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

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

于 2013-05-06T10:25:53.700 に答える
3

Web アプリケーションは多数の PHP クラスで構成され、通常、各クラスは個別のファイルに存在します。これにより、ファイルを含める必要が生じます。

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

この問題を解決するために、PHP 5.1 では、クラスの自動読み込み機能が導入されました。PHP 関数を使用すると、オートローダーspl_autoload_register()関数を登録できます。複雑な Web サイトの場合、スタックにチェーンされた複数のオートローダー関数を作成することもできます。

スクリプトの実行中に、まだ定義されていないクラス名が検出された場合、PHP インタープリターは、登録されているすべてのオートローダー関数を順番に呼び出します。これは、オートローダー関数にクラスが含まれるか、「見つかりません」というエラーが発生するまで続きます。これにより、PHP インタープリターが本当に必要なクラス呼び出しの瞬間にのみクラス定義を処理するときに、「遅延」読み込みが可能になります。

各ライブラリのベンダーは独自のコード命名規則とファイル編成規則を使用しているため、依存ライブラリごとに異なるカスタム オートローダー関数を登録する必要があり、かなり面倒です (実際、これは不要な作業です)。この問題を解決するために、PSR-0 標準が導入されました。

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

Web アプリケーションの各モジュールはオートローダーを登録します。これにより、モジュール内の任意の PHP クラスをオートロードできます。これは、クラスのgetAutoloaderConfig()メソッドで作成されます。Module

ZF2 にはZend\Loader、標準オートローダー ( Zend\Loader\StandardAutoloader) とクラス マップ オートローダー ( Zend\Loader\ClassMapAutoloader) の 2 つの一般的に使用されるオートローダー クラスの実装を含む、 という名前の特別なコンポーネントがあります。

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

クラス マップ オートローダは、標準オートローダのより高速な代替手段として使用できます。このオートローダは、クラス マップ配列を渡すことを想定しています。クラス マップの各キー=>値のペアは、それぞれクラス名とクラスを含む PHP ファイルへのパスです。

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

于 2014-01-25T06:22:00.493 に答える