まとめ ブログ ダウンロード 掲示板 メール

れぶろぐ

< 2009-05-16 (土) 2009-06-02 (火) > 最新


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() でそれ用のコールバック関数を追加する

という動作にしてくれた方が、シンプルかつ高速になると思うのですが。

Tags: Zend | このエントリを含む del.icio.us | このエントリを含むはてなブックマーク | このエントリを含む livedoor クリップ | Permalink
本日のリンク元

編集