1.7x で作りかけている Phwittr を動かしてみた。
<?php require_once 'Zend/Loader/Autoloader.php'; $autoloader = Zend_Loader_Autoloader::getInstance(); $autoloader->registerNamespace('Gene_') ->setFallbackAutoloader(false) ->suppressNotFoundWarnings(false);
View を生成する箇所でキャッシュを使っていて、そこでエラーになった。
Fatal error: method_exists() [function.method-exists]: The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "Revulo_View_Phtmlc" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition
エラーの箇所は View オブジェクトに addScriptPath() があるかチェックしている所でメソッドがないよーってなってる。
View オブジェクトをダンプすると、
object(__PHP_Incomplete_Class)[69] public '__PHP_Incomplete_Class_Name' => string 'Revulo_View_Phtmlc' (length=18)
とかってでた。
__PHP_Incomplete_Class なんて初めて知った。
ググってみたら、どうやらオブジェクトのアンシリアライズに失敗して中途半端にオブジェクトに復元してるよう。
原因は View として使用している Revulo_View_Phtmlc の名前空間が登録されていなかったから。
registerNamespace('Revulo_') と登録してやるか、 PEAR ライクな名前空間ならよろしく処理するように setFallbackAutoloader(true) すれば解決すると思う。
まぁライブラリを追加するたびに一々 registerNamespace() を書くのは手間がかかるから、 setFallbackAutoloader(true) するのが早いと思う。
setFallbackAutoloader(true) にして簡単に動作確認した限りでは問題なく動いている。
ただ、 1.8 になって Zend_Application が折角できたので、コアな箇所は新しく作り直す事にする。
アプリケーションの部分は 1.7x のでも動くはずなので、主にブートストラップ周りかな。
今までのコードは 1.7x 用としてとして残しておく。
これだけ大きく変わるのは Zend Framework 触りだして以来。
おそらく 2.0 では命名規約が PHP5.3 用になるはずなのでもっと変わると思うけど。
ネットで 1.8 のサンプル漁ったけど、みんなモジューラーディレクトリ機構使わないのかなー。
一応日本で 1.8 を使ってみた人達のリンクを貼っておこう (他に見つけたら随時追加予定 & 情報求む)。
- Zend_Application(1) - noopな日々
- Zend_Application(2) /Zend FrameworkにおけるDIコンテナ活用のメリットについて/ - noopな日々
- Zend_Application(3) リソースコンテナをアクションコントローラー内から使う方法 - noopな日々
- Zend_Application_Module_Autoloaderで、モジュールロードを手っ取り早く(デフォルトにそって)やる場合のメモ - 例えば、PHPを使う
- http://d.hatena.ne.jp/boto/20090504/1241421477
- http://nonn-et-twk.net/twk/node/316