で、早速詰まったorz
メッセージを見ると
Locale (Object id #1367) is a unknown localeそんなロケール知らないとか言われてます。 いや、何もしてないし、、、
そんな訳で調べてみると、どうやらZend_Dateのインスタンスを作成する時に、引数に日付の文字列("2008-12-31 00:00:00"とか)を渡した
時に発生している模様。私が試した環境では前述のようなコードを実装すると出ていましたが、他のパターンも 十分発生しうるかと。
なんでだろうかと探ってみた結果、自身でロケール属性を持っているのですが、 これが正しく設定出来てなく、
この不正なロケール属性でインスタンス生成が失敗しているのが原因のようです。
で、何故ロケール属性が正しく設定出来ていないかと言うと、Zend_Dateのコン
ストラクタでsetLocaleというメソッド
を実行しており、そこでZend_Localeクラスを文字列に変換しています。
Zend_Date public function setLocale($locale = null) { if (!Zend_Locale::isLocale($locale, true, false)) { if (!Zend_Locale::isLocale($locale, false, false)) { require_once 'Zend/Date/Exception.php'; throw new Zend_Date_Exception("Given locale ({$locale}) does not exist", (string) $locale); } $locale = new Zend_Locale($locale); } $this->_locale = (string) $locale; return $this; }
ここで期待された値はLocaleを示す文字列(jaとか)なのですが、
"Object id #1367"となってしまいました。
この差異はPHPのバージョンの違い、PHP5.2を境にして、出るようです。私の環境がPHP5.1.6で出ちゃいました><
Zend_Dateではマジックメソッドを使っおうとしていていますが、string型へのキャストはPHP5.2からのサポートなので 期待した結果が得られていません。
参考:href="http://php.benscom.com/manual/ja/language.oop5.magic.php">ttp://php.benscom.com/manual/ja/language.oop5.magic.php
__toString メソッドにより、 クラスが文字列に変換される際の動作を決めるこ とができます。 ・ ・ ・ 注意が必要なのは、PHP 5.2.0 より前では、__toString メソッドは echo() ま たは print(). と直接結合された場合のみコールされていたということです。
補足ですが、ZF1.7.4は最低限なシステム構成としてはどうやらPHP5.1.4、推奨はPHP5.2.4だそうです。 ここら辺の解釈は様々ありそうですが、とりあえずPHP5.2.0以前で動かすには一手間要るようです。
ちなみにブートファイルで
Zend_Registry::set('Zend_Locale','ja');
とやる事でも一応回避は出来ました。何故かZend_Registryを使ってて。。。どうなんだろう(^^;
そして気付いてみたら2/16に1.7.5がリリースされてました。 ちなみに同じようにはなりました。
0 件のコメント :
コメントを投稿