Zend Framework チュートリアルでのオートロードの使用方法の詳細な説明

高洛峰
リリース: 2017-01-03 12:47:19
オリジナル
1100 人が閲覧しました

この記事の例では、Zend Framework チュートリアルでのオートロードの使用法について説明します。参考のために皆さんと共有してください。詳細は次のとおりです:

1. 概要

自動読み込みは、PHP コードを手動で記述する必要をなくすメカニズムです。 「PHP 手動オートローディング」を参照してください。オートローダーが定義されると、未定義のクラスまたはインターフェイスを使用しようとした場合に自動的に呼び出されます。

自動読み込みを使用すると、プロジェクト内のクラスがどこに保存されているかを心配する必要がありません。明確に定義されたオートローダーを使用すると、現在のクラス ファイルと相対的なクラス ファイルの場所を考える必要がなく、クラスを使用するだけで、オートローダーが自動的にファイルを見つけます。

さらに、自動ロードにより、ロードされるのは 1 回だけとなり、パフォーマンスが向上するため、require_once() の代わりに使用できます。

Zend Framework はオートロードの使用を奨励し、コード ライブラリとアプリケーション コードを自動的にロードするための多くのツールを提供します。ここでは、これらのツールとその効果的な使用方法について説明します。

オートロードの実装規約

クラス命名規約

Zend Framework は、クラス名とファイル システム間の 1:1 の関係である PEAR のアイデアを借用しています。単純に、ディレクトリ区切り文字をファイルへのパスを表すアンダースコア文字 (「_」) に置き換え、接尾辞「.php」を追加します。たとえば、クラス「Foo_Bar_Baz」は、ファイル システム上の「Foo/Bar/Baz.php」に対応します。クラスの場所が PHP の include_path を介して設定されていると仮定すると、これにより、include_path に設定されたパスに相対的な include() および require() を介してファイル名を見つけることができます。

また、サプライヤー名またはプロジェクト名を接頭辞として使用することをお勧めします。これは、作成するすべてのクラスに共通のクラス接頭辞が付いていることを意味します。たとえば、Zend Framework のすべてのコードには「Zend_」という接頭辞が付けられます。この命名規則は、名前の競合を防ぐのに役立ちます。 ZendFramework では、「名前空間」接頭辞をよく参照しますが、PHP のローカル名前空間と混同しないように注意してください。

オートローダーの設計規約

Zend Framework は Zend_Loader_Autoloader による自動ロードをサポートしており、主に次の目標と設計要素を提供します:

名前空間のマッチングを提供します。クラスの名前空間プレフィックスが未登録の名前空間の場合、FALSE が返されます。

オートローダーを代替オートローダーとして定義できるようにします。チームが広範囲に分散している場合や、未定義の名前空間プレフィックスを使用している場合は、任意の名前空間プレフィックスとの一致を試みます。ただし、この方法は不要な検索が発生する可能性があるため、お勧めできません。
抑制されたエラープロンプトをオンにすることができます。 したがって、デフォルトではオフになっている必要があります。開発段階で有効にすることができます。

自動読み込みはカスタマイズ可能です。開発者の中には、自動ロードに Zend_Loader::loadClass() を使用したくないが、それでも Zend Framework の自動ロード メカニズムを使用したいと考えている人もいます。 Zend_Loader_Autoloader を使用すると、カスタム オートローディングの使用が可能になります。

SPL を使用したコールバック チェーンの自動ロードを許可します。この目的は、追加のオートローダーを指定できるようにすることです。

2. 使用法:

通常、必要なのは、それを含むクラスに導入してインスタンス化することだけです。 Zend_Loader_Autoloader で採用されているシングルトン モードにより、getInstance() メソッドを使用してインスタンスを取得できます。

require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();
ログイン後にコピー

デフォルトでは、名前空間プレフィックス「Zend_」または「ZendX_」を持つクラスはすべてロードできますが、include_path が指定されていることを確認してください。
他の名前空間プレフィックスを使用したい場合はどうすればよいですか?最も簡単な方法は、 registerNamespace() メソッドを呼び出すことです。これを行うには、単一の名前空間プレフィックスまたは配列を渡します:

require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('Foo_');
$loader->registerNamespace(array('Foo_', 'Bar_'));
ログイン後にコピー

あるいは、「フォールバック」オートローダーとして Zend_Loader_Autoloader を使用することもできます。これは、名前空間が定義されているかどうかに関係なく、自動ロードが試行されることを意味します。

$loader->setFallbackAutoloader(true);
ログイン後にコピー

(注: この方法は推奨されません。使用しないようにしてください)。

Zend_Loader_Autoloader の内部実装は Zend_Loader::loadClass() を使用してクラスをロードします。このメソッドは include() を使用して、指定されたクラス ファイルのロードを試みます。 include() はブール値を返し、失敗した場合は FALSE を返し、PHP 警告も発行します。 次の問題が発生する可能性があります:

display_errors が有効になっている場合、出力に警告が含まれます。

設定したerror_reportingレベルに応じて、ログに出力することもできます。
これらのエラー メッセージは次のように抑制できます: (ただし、display_errors が有効な場合、エラー ログは常に表示されることに注意してください。)

$autoloader->suppressNotFoundWarnings(true);
ログイン後にコピー

Zend Framework のバージョンを選択してください

ZendFramework/
|-- 1.9.2 /
| |-- ライブラリ/
|-- ZendFramework-1.9.1-minimal/
| |-- ライブラリ/
|-- 1.8.4PL1/
| |-- ライブラリ/
|-- 1.8.4/
| -- ライブラリ/
|-- ZendFramework-1.8.3/
| |-- ライブラリ/
|-- 1.7.7/
| -- library /
|-- 1.7.6/
| |-- library/

$autoloader->setZfPath($path, 'latest');
ログイン後にコピー
$autoloader->setZfPath($path, '1.8');
ログイン後にコピー
$autoloader->setZfPath($path, '1.7.7');
ログイン後にコピー

設定ファイルも使用できます

[production]
autoloaderZfPath = "path/to/ZendFramework"
autoloaderZfVersion = "1.7.7"
[qa]
autoloaderZfVersion = "1.8"
[development]
autoloaderZfVersion = "latest"
ログイン後にコピー

オートローダーインターフェイス

注: 名前空間プレフィックスと PHP 名前空間

PHP5.3 は解放されました。このバージョンでは、PHP が名前空間を正式にサポートするようになりました。

然而,Zend Framework的命名空间和PHP 5.3的命名空间完全不同的。 Zend Framework中,提到的“命名空间”,是指一个类前缀。例如,所有的Zend Framework的类名称的前缀“Zend_”。 这是我们指定的“命名空间”。

在Zend Framework 2.0.0使用了原生的PHP命名空间。

自动加载器除了能够指定任意回调以外,Zend Framework还定义了一个需要自动加载类实现的接口Zend_Loader_Autoloader_Interface:

interface Zend_Loader_Autoloader_Interface
{
  public function autoload($class);
}
ログイン後にコピー

如果您希望在Zend Framework中使用自定义的自动加载器,可以使用 Zend_Loader_Autoloader的 pushAutoloader()和unshiftAutoloader()方法。
通过这些方法将在Zend Framework的内部自动装载器之后追加或之前使用自定义的加载器。

每个方法接受一个可选的第二个参数,类的命名空间前缀。自动加载器只查找给定的类前缀。如果不是指定的类前缀,将跳过自动加载器 , 这可能是一种性能改进方式。

当使用这个接口时,你需要传递类实例到Zend_Loader_Autoloader类的pushAutoloader()和unshiftAutoloader()方法,具体如下:

// Append function 'my_autoloader' to the stack,
// to manage classes with the prefix 'My_':
$loader->pushAutoloader('my_autoloader', 'My_');
// Prepend static method Foo_Loader::autoload() to the stack,
// to manage classes with the prefix 'Foo_':
$loader->unshiftAutoloader(array('Foo_Loader', 'autoload'), 'Foo_');
// Assume Foo_Autoloader implements Zend_Loader_Autoloader_Interface:
$foo = new Foo_Autoloader();
$autoloader->pushAutoloader($foo, 'Foo_');
ログイン後にコピー


Zend_Loader_Autoloader的相关方法

Zend Framework教程之Autoloading用法详解

Zend Framework教程之Autoloading用法详解


希望本文所述对大家PHP程序设计有所帮助。

更多Zend Framework教程之Autoloading用法详解相关文章请关注PHP中文网!

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート