この記事では、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 が返されます。オートローダーを代替オートローダーとして定義できるようにします。チームが広範囲に分散している場合や、未定義の名前空間プレフィックスを使用している場合は、任意の名前空間プレフィックスとの一致を試みます。ただし、この方法は不要な検索が発生する可能性があるため、お勧めできません。
エラー プロンプトの抑制をオンにできます。 したがって、デフォルトではオフになっている必要があります。開発段階で有効にすることができます。
SPL を使用したコールバック チェーンの自動ロードを許可します。この目的は、追加のオートローダーを指定できるようにすることです。
2. 使用方法:
通常は、含まれるクラスにニーズを導入してインスタンス化するだけです。 Zend_Loader_Autoloader で採用されているシングルトン モードにより、getInstance() メソッドを使用してインスタンスを取得できます。リーリー
デフォルトでは、名前空間プレフィックス「Zend_」または「ZendX_」を持つクラスはすべてロードできますが、include_path が指定されていることを確認してください。
別の名前空間プレフィックスを使用したい場合はどうすればよいでしょうか?最も簡単な方法は、 registerNamespace() メソッドを呼び出すことです。これを行うには、単一の名前空間プレフィックスまたは配列を渡します:
リーリー
リーリー
(注: この方法は推奨されません。使用しないようにしてください)。Zend_Loader_Autoloader の内部実装は Zend_Loader::loadClass() を使用してクラスをロードします。このメソッドは include() を使用して、指定されたクラス ファイルのロードを試みます。 include() はブール値を返し、失敗した場合は FALSE を返し、PHP 警告も発行します。 次の問題が発生する可能性があります:
display_errors が有効になっている場合、出力に警告が含まれます。
設定したerror_reportingレベルに応じて、ログに出力することもできます。
これらのエラー メッセージは次のように抑制できます: (ただし、display_errors が有効になっている場合、エラー ログは常に表示されることに注意してください。)
リーリー
ZendFramework/
|-- 1.9.2/
| |-- 図書館/
|-- ZendFramework-1.9.1-minimal/
| |-- 図書館/
|-- 1.8.4PL1/
| |-- 図書館/
|-- 1.8.4/
| |-- 図書館/
|-- ZendFramework-1.8.3/
| |-- 図書館/
|-- 1.7.8/
| |-- 図書館/
|-- 1.7.7/
| |-- 図書館/
|-- 1.7.6/
| |-- 図書館/
リーリー
リーリー
リーリー
[production] autoloaderZfPath = "path/to/ZendFramework" autoloaderZfVersion = "1.7.7" [qa] autoloaderZfVersion = "1.8" [development] autoloaderZfVersion = "latest"
Autoloader接口
注:命名空间前缀和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的相关方法
Method | Return Value | Parameters | Description |
---|---|---|---|
getInstance() | Zend_Loader_Autoloader | N/A |
获取实例 |
resetInstance() | <font color="#000000" face="NSimsun">void</font> |
N/A |
重置Zend_Loader_Autoloadersingleton实例的状态,恢复它的原始状态,注销所有的自动加载器回调和所有注册的命名空间。 |
autoload($class) | <font color="#000000"><font face="NSimsun">string|<strong><tt>FALSE</tt></strong></font></font> |
|
试图加载一个类。 |
setDefaultAutoloader($callback) | Zend_Loader_Autoloader |
|
指定默认的加载器回调 |
getDefaultAutoloader() | <font color="#000000" face="NSimsun">callback</font> |
N/A |
获取默认的加载器接口;默认是Zend_Loader::loadClass(). |
setAutoloaders(array $autoloaders) | Zend_Loader_Autoloader |
|
オートローダースタック内の特定のオートローダーリストを使用するように設定します。オートローダー リストの各項目は PHP コールバックである必要があります。 |
getAutoloaders() | 配列 | 該当なし |
|
getNamespaceAutoloaders($namespace) | 配列 |
|
登録されているすべてのオートローダーを取得して、特定の名前空間をロードします。 |
名前空間を登録する($namespace) | Zend_Loader_Autoloader |
|
名前空間を登録します。$namespaceが文字列の場合は、その名前空間を登録します。文字列の配列の場合は、それぞれを名前空間として登録します。 |
Namespace($namespace)の登録を解除する | Zend_Loader_Autoloader |
|
|
getRegisteredNamespaces() | 配列 | 該当なし
|
|
suppressNotFoundWarnings($flag = null) |
<font color="#000000" face="NSimsun">boolean|Zend_Loader_Autoloader</font>
|
|
エラーメッセージ |
setFallbackAutoloader($flag) | Zend_Loader_Autoloader |
|
|
はFallbackAutoloader()です | ブール | 該当なし |
|
getClassAutoloaders($class) | 配列 |
|
|
unshiftAutoloader($callback, $namespace = '') | Zend_Loader_Autoloader |
|
|
pushAutoloader($callback, $namespace = '') | Zend_Loader_Autoloader |
|
|
removeAutoloader($callback, $namespace = '') | Zend_Loader_Autoloader |
|
より zend 関連のコンテンツに興味のある読者は、このサイトの特別トピックをチェックしてください: 「Zend FrameWork フレームワーク入門チュートリアル」、「php 優れた開発フレームワークの概要」、「Yii フレームワークの紹介と一般的なテクニックの概要」、「ThinkPHP」入門チュートリアル』『PHPオブジェクト指向プログラミング入門チュートリアル』『php+mysqlデータベース操作入門チュートリアル』『php共通データベース操作スキルまとめ』
この記事が PHP プログラミングのすべての人に役立つことを願っています。