2009-05-24 (日)
■ Zend_Loader_Autoloader クラスの正しい使い方
まずは結論を。 Zend_Loader_Autoloader クラスを用いる際には、 registerNamespace() メソッドは使わず、 setFallbackAutoloader(true) に設定しておくべきです。
Zend Framework 1.8 では、Zend_Loader_Autoloader というクラスが新設され、 従来の Zend_Loader::registerAutoload() メソッドは、 Zend Framework 2.0 以降では廃止される予定となりました。
ところが、Zend_Loader_Autoloader クラスを用いるようコードを書き換えてみると、 困ったことに、PEAR のライブラリや Revulo_View_Phtmlc のような独自クラスをオートロードしてくれません。 この問題の解決策として、マニュアルには2つの方法が示されています。
- $autoloader->setFallbackAutoloader(true); に設定する
- $autoloader->registerNamespace('Revulo_'); のように、必要なだけネームスペース (prefix) を追加する
setFallbackAutoloader() メソッド
fallback というネーミングがあまり良くないと思うのですが、これは 「Zend_Loader::loadClass() をデフォルトのオートローダとして用いるかどうか?」 という設定をするメソッドです。
Zend_Loader::loadClass() は、Zend Framework や PEAR 形式のクラス名に対応しています。 そのため、setFallbackAutoloader(true) に設定すれば、 PEAR や openpear のクラスは全て自動的に読み込んでくれます。 つまり、以前の Zend_Loader::registerAutoload() と同じ動作をしてくれるようになります。
registerNamespace() メソッド
デフォルトの設定では、 オートロードされるのは Zend_ か ZendX_ という prefix を持つクラスに限定されていますが、 registerNamespace() メソッドを使うことで、この prefix を追加することができます。
ところが、Zend_Loader_Autoloader のコード (特に getClassAutoloaders() メソッドの辺り) を読んでみると、 実は、registerNamespace() でネームスペースを追加すればするほど動作は遅くなることが分かります。 つまり、登録するネームスペースの数はなるべく少なくしておく方が良いです。
この考えを突き詰めていくと、 そもそも setFallbackAutoloader(true) に設定すれば、 Zend_ と ZendX_ というネームスペースの登録は必要なかったりします。 以上のことから、Zend_Loader_Autoloader クラスを用いる際には、
require_once 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->unregisterNamespace(array('Zend_', 'ZendX_'))
->setFallbackAutoloader(true);
という使い方をするのが、最も効率がよいと思います。
実際には、unregisterNamespace() メソッドは無理に使わなくても良いと思いますし、 ベンチマークを取っても差はほとんど出ないと思いますが、 registerNamespace() メソッドを使うくらいなら、 setFallbackAutoloader(true) に設定する方がよい、ということです。
・・・・と、書いていて分からなくなったのですが、 そもそも registerNamespace() メソッドの存在意義ってあるんでしょうか? Zend_Loader_Autoloader クラスを、
- setFallbackAutoloader(true) をデフォルトの設定にする
- $_namespaces などというプロパティはなくしてしまう
のように仕様変更して、
- 通常は、デフォルトのオートローダ (Zend_Loader::loadClass()) に処理を任せる
- Zend Framework や PEAR とは異なる命名規則のクラスも扱いたい場合は、pushAutoloader() でそれ用のコールバック関数を追加する
という動作にしてくれた方が、シンプルかつ高速になると思うのですが。
- 50 google検索(Zend_Loader_Autoloader)
- 34 google検索(setFallbackAutoloader)
- 28 google検索(Zend_Loader_Autoloader)
- 26 google検索(setFallbackAutoloader)
- 15 google検索(zend autoloader)
- 9 google検索(Zend_Loader_Autoloader)
- 8 google検索(Zend_Loader_Autoloader)
- 8 google検索(f)
- 7 google検索(setFallbackAutoloader)
- 6 google検索(zend autoloader)
- 5 google検索(setFallbackAutoloader)
- 5 google検索(zend framework autoloader)
- 5 google検索(Zend_Loader_Autoloader)
- 5 google検索(setFallbackAutoloader)
- 5 google検索(Zend_Loader_Autoloader)
- 5 google検索(Zend_Loader_Autoloader)
- 5 http://webcache.googleusercontent.com/search?q=cac...
- 4 google検索(Zend_Loader_Autoloader)
- 4 google検索(zend_loader_autoloader)
- 4 google検索(zend_loader_autoloader)
- 4 google検索(setFallbackAutoloader)
- 4 http://bookmark.santalinux.net/tags/zend loader au...
- 3 http://www.soukyu-mugen.com/artList?fid=1588
- 3 google検索(zend 使い方)
- 3 google検索(zend autoloader)
- 3 google検索(setFallbackAutoloader)
- 3 google検索(zend autoloader)
- 3 google検索(autoloader zend framework 1.8)
- 3 google検索(Zend_Loader_Autoloader )
- 3 google検索(Zend_Loader_Autoloader )
- 3 google検索(Zend_Loader_Autoloader)
- 3 google検索(Zend_Loader_Autoloader)
- 3 google検索(zend loader autoloader 使い方)
- 3 google検索(Zend_Loader_Autoloader)
- 3 http://www.google.co.jp/reader/view/
- 3 http://life.co-hey.com/2009/10/zend_loader_autoloa...
- 2 http://www.revulo.com/notify-NotifyUser_OTHER_0712...
- 2 google検索(Zend_Loader_Autoloader)
- 2 google検索(Fallback Autoloader)
- 2 google検索(Zend_Loader_Autoloader)
- 2 google検索(Zend_Loader_Autoloader)
- 2 google検索(zend autoloader)
- 2 google検索(setFallBackAutoloader)
- 2 google検索(Zend_Loader_Autoloader)
- 2 google検索(zendframework setfallbackautoloader)
- 2 google検索(zend Autoloader)
- 2 google検索(zend framework setFallbackAutoloader)
- 2 google検索(Zend_Loader_AutoLoader)
- 2 google検索(zend autoloader)
- 2 google検索(f)
- 2 google検索(Zend_Loader_Autoloader)
- 2 google検索(Zend_Loader_Autoloader)
- 2 google検索(setFallbackAutoloader)
- 2 google検索(zend setFallbackAutoloader)
- 2 google検索(zend registerNamespace)
- 2 google検索(zend framework オートローダ)
- 2 google検索(zend autoloader)
- 2 google検索(zend autoloader)
- 2 google検索(zend オートローダー)
- 2 google検索(setFallbackAutoloader)
- 2 google検索(setFallbackAutoloader)
- 2 google検索(setFallbackAutoloader)
- 2 google検索(setFallbackAutoloader)
- 2 google検索(setFallbackAutoloader)
- 2 google検索(setFallbackAutoloader)
- 2 google検索(setFallbackAutoloader(true))
- 2 google検索(fallback autoloader zend)
- 2 google検索(Zend_Loader_autoloader)
- 2 google検索(Zend_Loader_Autoloader::getInstance())
- 2 google検索(Zend_Loader_Autoloader)
- 2 google検索(Zend_Loader_Autoloader)
- 2 google検索(Zend_Loader_Autoloader::getInstance())
- 2 google検索(zend_loader_autoloader)
- 2 google検索(zend autoloader)
- 2 google検索(zend オートローダー)
- 2 google検索(zend autoloader)
- 2 google検索(setFallbackAutoloader)
- 2 google検索(setFallbackAutoloader)
- 2 google検索(setFallbackAutoloader)
- 2 google検索(setFallbackAutoloader)
- 2 google検索(Zend_Loader_Autoloader)
- 2 google検索(Zend_Loader_Autoloader)
- 2 google検索(Zend_Loader_Autoloader)
- 2 google検索(Zend_Loader_Autoloader)
- 2 google検索(Autoloader.php zend)
- 2 google検索(zend Autoloader)
- 2 google検索(zend autoloader)
- 2 google検索(setFallbackAutoloader)
- 2 google検索(Zend_Loader_Autoloader)
- 2 google検索(setFallbackAutoloader)
- 2 google検索(setFallbackAutoloader)
- 2 google検索(zend_loader_autoloader)
- 2 google検索(zend_loader registerautoload)
- 2 google検索(zend autoloader)
- 2 google検索(setFallbackAutoloader)
- 2 google検索(setFallbackAutoloader)
- 2 google検索(setFallbackAutoloader)
- 2 google検索(pushAutoloader zend)
- 2 google検索(autoloader = Zend_Loader_Autoloader::getInstance();)
- 2 google検索(Zend_Loader_Autoloader)
