Zend Frameworkでの自動読み込み

こんばんは、親愛なるhabrasociety。 Learning Zend Frameworkシリーズの記事の翻訳を紹介します。

私は英語の分野の専門家ではなく、100%正しい翻訳のふりをしないですぐに予約したいと思いますが、最近、私は自由に話し、読み、書きたいので、できる限りそれを勉強することを始めました。

したがって、翻訳に不正確な点を見つけた場合、何か間違った翻訳や解釈をした場合は、私に連絡してください。間違いを訂正し、非常に感謝します。

したがって、実際には翻訳:


はじめに



オートロードは、PHPコード内のファイルとクラス間の依存関係を手動で追跡する必要性を排除するメカニズムです。

PHPマニュアル対応するセクションでは 、起動メカニズムの接続方法について説明しています。 このメカニズムを接続した後、未定義のクラスまたはインターフェイスを使用すると、autoload関数が自動的に呼び出されます。

スタートアップ関数を使用すると、使用しているクラスがプロジェクト内のどのファイルであるかを心配する必要がありません。 優れたオートローダーがあれば、必要なクラスが記述されているファイルの場所を気にする必要はありません。 コード内のクラスにアクセスするだけで、オートローダーが処理します
必要なクラスの発表の検索機能。

さらに、自動読み込みを使用すると、さらに多くの時間が必要になるため、時間を大幅に節約できます。
ファイルがすでに接続されているかどうかを気にする必要はありません。 あなたに
ファイルが以前に接続されたかどうか、およびファイルがまだ接続されていることが判明するかどうかを確認する必要はありません。
これにより、 require_once()を使用する必要がなくなります。 ファイルを接続します。

Zend Frameworkはautoloadクラスの使用を推奨し、ロードするためのいくつかの手段を提供します
サードパーティクラス、およびアプリケーション内でのクラスのロード。 このガイドでは、Zend Frameworkを使用してクラスの自動ロード機能を使用する方法を説明し、これらの機能を最も効果的に使用するのに役立ちます。

目標とデザイン


クラスの命名規則


Zned Frameworkでオートロードを使用する方法を理解するには、まず理解する必要があります
このフレームワークでのクラス名とファイル名の関係。

Zend Frameworkは、クラス名とファイル名の比率が1対1であるPEARで採用されているクラス名を使用します。 簡単に言えば、 ZFでは、クラス名記号「_」「/」に置き換えられ、最後にサフィックス「.php」がクラス名に追加されます。 たとえば、クラス名「Foo_Bar_Baz」は、実際のファイル「Foo / Bar / Baz.php」を指します。 さらに、PHPのinclude_path変数でファイルを検索することになっています。 これにより、この構成オプションで指定されたディレクトリでファイルを検索することにより、ファイルを接続できます。

さらに、すべてのプロジェクトにプレフィックスを使用することをお勧めします。 たとえば、すべての名前
Zend Frameworkのクラスはプレフィックス"Zend_"で始まります。 これにより、名前の競合が回避されます
さまざまなライブラリを使用する場合。 Zend Framework内では、これらのプレフィックスをスペースと呼びます
名前(「名前空間」)。 PHP名前空間と混同しないでください。

このようなルールと規則は、Zend Frameworkで一般的に使用されており、
これらのルールを順守してください。

規則とオートローダーの設計


Zend Frameworkは、 Zend_Loader_Autoloaderクラスを使用して自動ロードを実装します
次のルールが適用され、次の契約があります。

1.一致する名前空間を確認します。 クラスのプレフィックスが登録されていない場合
アプリケーション内では、名前空間はFALSEを返します。 そのような組織の助けを借りて、次のことができます
自動ロードを他の自動ローダーに転送します。
2.フォールバックモードを有効にできます。 このモードがアクティブになると、ブートローダーは
ローダーに固有の「名前空間」に関係なくクラスを探します。

3.ブートローダーが必要なクラスを見つけられない場合、 エラー出力を無効にすることができます
デフォルトでは、このオプションは無効になっています。 ただし、必要に応じてオンにすることができます。

4.コールバック関数を作成できます。たとえば、ユーザーが望んでいない場合
組み込みメソッドZend_Loader :: loadClass()を使用します。 しかし、同時に彼は使用したい
Zend_Loader_Autoloaderオートローダーのメカニズム。

5.異なるブートローダーのチェーンを構築できます。 この方法で接続できます
たとえば、命名規則に該当しないクラスをロードするための機能
Zend Frameworkのクラス。 標準の前後にオートローダーを使用できます
Zend Frameworkブートローダー。

ブートローダーの基本的な使用。



基本を理解したので、次に練習に進んで使用方法を見てみましょう
クラスZend_Loader_Autoloader。

このクラスのファイルを接続する最も簡単な方法。 そして、ブートローダインスタンスを取得します。 また、注意する必要があります
Zend Frameworkブートローダーがシングルトンパターンに基づいて構築されていること。 したがって、オブジェクトを取得するには
getInstance()メソッドが使用されます。

  1. require_once 'Zend / Loader / Autoloader.php' ;
  2. Zend_Loader_Autoloader :: getInstance ;


デフォルトでは、ブートローダーはプレフィックスで始まるすべてのクラスを自動的に接続します。
"Zend_"または"ZendX_"include_path変数で指定されるパス。

優れたプレフィックスを持つクラスをブートローダーに強制的に検索させる場合の対処方法
Zend_から。 registerNamespace()メソッドを使用する必要があります。 このメソッドは、パラメーターとしてプレフィックスまたはプレフィックスの配列を受け入れます。 この方法を使用してプレフィックスを追加した後、
ローダーは、このプレフィックスを持つクラスを自動的に検索してロードします。

  1. require_once 'Zend / Loader / Autoloader.php' ;
  2. $ loader = Zend_Loader_Autoloader :: getInstance ;
  3. $ loader- > registerNamespace 'Foo_' ;
  4. $ loader- > registerNamespace array 'Foo_' 'Bar_' ;


さらに、フォールバックモードを有効にできます。 これは、接頭辞に関係なく、ローダーがすべてのクラスを検索することを意味します。

  1. $ loader- > setFallbackAutoloader true ;


ご注意
フォールバックモードを使用しないでください。 プロジェクトでこのオプションを放棄することをお勧めします
Zend Frameworkは、どんなに魅力的に見えても。

Zend_Loader_AutoloaderZend_Loader :: loadClass()メソッドを使用します。
include()関数を使用してファイルをインクルードします。 ファイルがない場合は、 インクルード()
falseを返します。 また、PHPは警告「WARNING ERROR」を返します。

これはいくつかの問題を引き起こす可能性があります。
1. display_errorsオプションがアクティブな場合、エラー警告が出力ストリームに送信されます。
2.エラーの出力を表示するerror_reportingモードが設定されている場合、それらはログに書き込まれます
ファイル接続エラーに関するすべての警告。

もちろん、有効になっている場合でもZend_Loader_Autoloader内のエラー出力をオフにすることができます
オプションdisplay_errors ただし、このオプションでは、出力ストリームのエラーのみが抑制されます。
とにかくエラーはログに書き込まれるため、プレフィックスを使用することをお勧めします
クラスをブートローダーに登録します。

注:
このマニュアルが書かれたとき、PHP 5.3リリースがリリースされました。 このバージョンのPHPから
名前空間をサポートします。 ただし、ZFはこの機能の前に開発されました
PHPに登場し、フレームワーク内で名前空間を使用することに同意しました
クラス名にプレフィックスを割り当てます。 たとえば、フレームワークのすべてのクラスのZend_プレフィックス。
バージョン2以降、ブートローダーにphp名前空間のサポートを含める予定です。
フレームワーク。

関数を使用してファイルとクラスを自動ロードする場合は、
pushAutoloader()およびunshiftAutoloader()メソッドを使用して、 Zend_Loader_Autoloaderローダーに追加できます。 これらのメソッドを使用すると、Zend Frameworkブートローダーを呼び出す前または後にブートローダーを追加して、異なるブートローダーのチェーンを形成できます。

このアプローチの利点は次のとおりです。
1.これらの各メソッドは、2番目のオプションパラメータを取ります。
ロードするプレフィックスクラス。 つまり Zend Frameworkブートローダーに伝えることができます。
チェーンに接続されたローダーは、特定のプレフィックスを持つクラスのみを処理する必要があること。
2.次のように、ロード制御に問題はありません。 すべてのチェーンメソッドには機能があります
コールバック。 spl_autoload_functions()メカニズムには欠けています。

  1. //スタックに関数「my_autoloader」を追加し、
  2. //接頭辞「My_」を持つクラスを管理するには:
  3. $ loader- > pushAutoloader 'my_autoloader' 'My_' ;
  4. //静的メソッドFoo_Loaderの前に追加します:: autoload()をスタックに追加し、
  5. //接頭辞「Foo_」を持つクラスを管理するには:
  6. $ loader- > unshiftAutoloader array 'Foo_Loader' 'autoload' 'Foo_' ;


スタートアップリソース。



実際のアプリケーションを開発するとき、すべてのアプリケーションライブラリではない状況が発生することがあります
Zend Frameworkで受け入れられている名前の推奨に該当します。 これは、オートローダーが次のことができないことを意味します
必要なファイルを見つけます。

したがって、規則とブートローダーの設計に関するセクションを読むと、推測できます。
Zend Frameworkはこの問題を解決できます。 このために、クラスZend_Loader_Autoloader_Resourceがあります。
リソースは、名前の存在と、必要なクラスの検索が行われるパスを意味します。
およびファイル。 最も単純な場合、次のようになります。

  1. $ loader = new Zend_Application_Module_Autoloader array
  2. '名前空間' => 'ブログ'
  3. 'basePath' => APPLICATION_PATH '/ modules / blog'
  4. ;


まず、接続するリソースのタイプをブートローダーに通知する必要があります。
これらのタイプはキーと値のペアです。

たとえば、次のディレクトリツリーを使用します。

  1. パス/ to / some / resources /
  2. |-フォーム/
  3. | ` -ゲストブック php // Foo_Form_Guestbook
  4. |-モデル/
  5. | | -DbTable /
  6. | | ` -ゲストブック php // Foo_Model_DbTable_Guestbook
  7. | |-ゲストブック php // Foo_Model_Guestbook
  8. | `-GuestbookMapper php // Foo_Model_GuestbookMapper


まず、リソースを作成します。

  1. $ loader = new Zend_Loader_Autoloader_Resource array
  2. 'basePath' => 'path / to / some / resources /'
  3. 'namespace' => 'Foo'
  4. ;


その後、リソースのタイプを決定する必要があります。 Zend_Loader_Autoloader_Resourse :: addResourceType()メソッド
3つの引数を取ります。 最初の引数はリソースの名前です。 2番目の引数は、リソースのルートディレクトリに関連する特定のリソースを検索するディレクトリです。 3番目のパラメーターは、クラスプレフィックス(または名前空間)です。
この例では、3種類のリソースがあります。 最初のフォームはformsディレクトリにあり、プレフィックス「Form_」が付いています。 2番目のモデルは、modelsディレクトリにあり、対応するディレクトリにModel_というプレフィックスと3番目のdbTableがあります。

  1. $ loader- > addResourceType 'form' 'forms' 'Form'
  2. -> addResourceType 'model' 'models' 'Model'
  3. -> addResourceType 'dbtable' 'models / DbTable' 'Model_DbTable' ;


発表後、次のクラスを使用してリソースをロードできます。

  1. $ form = new Foo_Form_Guestbook ;
  2. $ guestbook = new Foo_Model_Guestbook ;


おわりに



Zend Frameworkは、オートローディングクラスの使用を推奨し、初期化します
Zend_Applicationクラスのこのメカニズム。
このガイドがZend_Loader_Autoloaderコンポーネントの使用に関する必要な情報を提供し、独自のカスタムオートローダーとリソースオートローダーを接続するなどの利点を理解するのに役立つことを願っています。

フレームワークのコンポーネントであるZend_Loader_AutoloaderおよびZend_Loader_Autoloader_Resourceの詳細については、マニュアルの対応するセクションを参照してください。 Zend_Loader_AutoloaderおよびZend_Loader_Autoloader_Resource

Source: https://habr.com/ru/post/J119739/


All Articles