Zend FrameworkチュートリアルのAutoloadingの使い方の詳細

8436 ワード

この例では、Zend FrameworkチュートリアルのAutoloadingの使い方について説明します.皆さんの参考にしてください.具体的には以下の通りです.
一、概説
自動ロードは、手動でPHPコードを記述する必要がないメカニズムです.参考»PHPマニュアルは自動的にロードされ、自動ローダが定義されると、定義されていないクラスやインタフェースを使用しようとすると、自動的に呼び出されます.
自動ロードを使用すると、プロジェクトでクラスの保存場所を心配する必要はありません.適切に定義された自動ローダを定義します.現在のクラスファイルに対するクラスファイルの位置を考慮する必要はありません.クラスを使用するだけで、自動ローダは自動的にファイルを検索します.
また、自動ロードは、1回のみロードされ、パフォーマンスが向上することを保証します.require_の代わりに使用できます.once().
Zend Frameworkは自動ロードを奨励し、多くのツールが自動ロードコードライブラリとアプリケーションコードを実現しています.これらのツールと、効果的に使用する方法について説明します.
自動ロードの実装規則
クラス命名規則
Zend FrameworkはPEARの考え方,すなわちクラス名とファイルシステムの1:1の関係を参考にした.簡単に言えば、下線文字("")はディレクトリ区切りを置き換え、ファイルのパスを表し、接尾辞「.php」を追加します.たとえば、クラス「Foo_Bar_Baz」は、ファイルシステム上の「Foo/Bar/Baz.php」に対応します.PHPのinclude_を通過したとします.pathはクラスの位置を設定し、include()とrequire()を使用して相対的なinclude_を見つけることができます.pathで設定したパスはファイル名を検索します.
また、仕入先名またはプロジェクト名を接頭辞として使用することを推奨します.これは、あなたが書いたすべてのクラスに共通のクラス接頭辞があることを意味します.例えば、Zend Frameworkのすべてのコード接頭辞は「Zend_」です.この命名規則は、命名の競合を防止するのに役立ちます.ZendFrameworkでは、PHPのローカルネーミングスペースと混同しないように注意して、「namespace」接頭辞によく言及しています.
自動ローダ設計規則
Zend FrameworkはZend_を通りますLoader_Autoloaderは自動ロードをサポートし、主に以下の目標と設計要素を提供します.
ネーミングスペースマッチングを提供します.クラスのネーミングスペース接頭辞が登録されていないネーミングスペースの場合、FALSEが返されます.
自動ローダを代替の自動ローダとして定義できます.1つのチームが広く分布しているか、定義されたネーミングスペース接頭辞を使用している場合は、任意のネーミングスペース接頭辞に一致しようとします.しかし、不要な検索を招く可能性があるため、この方法は推奨されません.エラーメッセージの無効化を許可します.したがって、デフォルトではオフにする必要があります.開発フェーズでは、有効にできます.
自動ロードをカスタマイズできます.一部の開発者はZend_を使用したくないLoader::loadClass()は自動的にロードされますが、Zend Frameworkの自動ロードメカニズムを使用したいと考えています.Zend_Loader_Autoloaderでは、カスタムの自動ロードを使用できます.
SPLを使用してコールバックチェーンを自動的にロードできます.この目的は、追加の自動ローダを指定できるようにすることです.
二、使い方:
通常、含めるクラスを導入してインスタンス化するだけです.Zend_Loader_Autoloaderが使用する単一のモードでは、getInstance()メソッドを使用してインスタンスを取得できます.

require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();


デフォルトでは、include_が指定されていることを確認する限り、名前空間接頭辞が「Zend_」または「ZendX_」のクラスをロードできます.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警告も発行されます.次の問題が発生する可能性があります.
ディスプレイが有効になっている場合errors、警告は出力に含まれます.
あなたが設定したerrorに基づいてReportingレベルで、ログに出力することもできます.これらのエラーメッセージは以下のように禁止できます(ただし、display_errorsが有効になっている場合、エラーログは常に表示されます.)

$autoloader->suppressNotFoundWarnings(true);


Zend Frameworkのバージョンを選択
ZendFramework/|-- 1.9.2/|   |-- library/|-- ZendFramework-1.9.1-minimal/|   |-- library/|-- 1.8.4PL1/|   |-- library/|-- 1.8.4/|   |-- library/|-- ZendFramework-1.8.3/|   |-- library/|-- 1.7.8/|   |-- library/|-- 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"


Autoloaderインタフェース
注意:ネーミングスペース接頭辞とPHPネーミングスペース
PHP 5.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の内部オートローダの後にカスタムローダを追加または使用します.
各メソッドは、オプションの2番目のパラメータ、クラスのネーミングスペース接頭辞を受け入れます.自動ローダは、指定されたクラス接頭辞のみを検索します.指定したクラス接頭辞でない場合、自動ローダはスキップされます.これはパフォーマンスの改善策かもしれません.
このインタフェースを使用する場合は、クラスインスタンスを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() void
N/A
Zend_をリセットLoader_Autoloadersingletonインスタンスのステータスを復元し、元のステータスを復元し、すべての自動ローダコールバックとすべての登録されたネーミングスペースをログアウトします.
autoload($class) string|FALSE
$class,required. A string class name to load.
クラスをロードしようとします.
setDefaultAutoloader($callback)
Zend_Loader_Autoloader
$callback,required.
デフォルトのローダコールバックの指定
getDefaultAutoloader() callback
N/A
デフォルトのローダインタフェースを取得します.デフォルトはZend_Loader::loadClass().
setAutoloaders(array $autoloaders)
Zend_Loader_Autoloader
$autoloaders,required.
自動ローダスタックで特定の自動ローダリストを使用するように設定します.自動ローダリストの各項目はPHPcallbackでなければなりません.
getAutoloaders()
Array
N/A
 
getNamespaceAutoloaders($namespace)
Array
$namespace,required
登録されているすべての自動ローダを取得して、特定のネーミングスペースをロードします.
registerNamespace($namespace)
Zend_Loader_Autoloader
$namespace,required.
名前空間を登録します.If$namespace is a string, it registers that namespace; if it's an array of strings, registers each as a namespace.
unregisterNamespace($namespace)
Zend_Loader_Autoloader
$namespace,required.
getRegisteredNamespaces()
Array
N/A
suppressNotFoundWarnings($flag = null) boolean|Zend_Loader_Autoloader
$flag,optional.
エラーメッセージ
setFallbackAutoloader($flag)
Zend_Loader_Autoloader
$flag,required.
 
isFallbackAutoloader()
Boolean
N/A
 
getClassAutoloaders($class)
Array
$class,required.
 
unshiftAutoloader($callback, $namespace = '')
Zend_Loader_Autoloader
$callback,required. A valid PHPcallback
$namespace,optional. A string representing a class prefix namespace.
 
pushAutoloader($callback, $namespace = '')
Zend_Loader_Autoloader
$callback,required. A valid PHPcallback
$namespace,optional. A string representing a class prefix namespace.
 
removeAutoloader($callback, $namespace = '')
Zend_Loader_Autoloader
$callback,required. A valid PHPcallback
$namespace,optional. A string representing a class prefix namespace, or an array of namespace strings.
zendに関する詳細については、「Zend FrameWorkフレームワーク入門チュートリアル」、「php優秀開発フレームワーク総括」、「Yiiフレームワーク入門および常用テクニック総括」、「ThinkPHP入門チュートリアル」、「phpオブジェクト向けプログラム設計入門チュートリアル」、「php+mysqlデータベース操作入門チュートリアル」および「php一般データベース操作テクニック要約」
ここで述べたことが皆さんのPHPプログラム設計に役立つことを願っています.