2011年5月5日木曜日

Quercus上での値の取り扱いについて

Quercus上の値をJava側に渡したときにどうなるか・・・
まとめておきます。

まずは基礎、どんな対応になっているか
http://caucho.com/resin-3.1/doc/quercus.xtp
基本的なデータはこちらにあります。
ここに掲載されていないもの
"あいうえお"等のConstString on PHP→ConstStringValue
class定義されたものon PHP→ObjectExtValue
配列→ArrayValueImpl
このあたり注意

Java側のメソッドを呼び出したときに自動的に型変換されるもの。
数字は基本的に戻る。ただしlongやdoubleになるようです。(例floatの範囲内でもdouble扱いになります。)
文字列もStringに戻る。
その他のものは元に戻らず。com.caucho.quercus.env.****Valueの型になったままになるらしい。
クラス定義をPHP側で実行したものはObjectExtValueのまま
クラス定義をJava側で実行し、PHP側でInstanceを生成したものは元のJavaオブジェクトに戻る。
はい、ここ注意です。ちゃんとJavaのクラスオブジェクトに変換されます。
ちなみに、クラス定義をJava側で実施し、PHP側で継承したクラスをつくり、継承したクラスのインスタンスを作った場合はObjectExtValue扱いです。

注意事項その1
そして注意が必要なのは、配列もArrayValueImplのままであり、配列の中身のデータは整数や文字列であってもJavaのオブジェクトにもどっていない。
ここ、絶対に注意です。
さらに、配列の添字として文字列をおくるとき、ArrayValueImpl相手に送るにはStringValue互換の型に変換しないと動作しません。
JavaのStringをポンといれても動作しねぇ・・・orz

注意事項その2
PHP側でクラス定義を実行し、インスタンスをつくったものをJava側に渡すとObjectExtValueになりますが、こいつを実行するにはcallMethodを呼び出してやればよい。
ただし内部の引数はすべてcom.caucho.quercus.env.Valueの型にする必要あり。

このPHP側のデータの呼び出しの型変換自動で実行してくれれば素敵なんですが、そのあたりどうなんですかね?
Servletで呼び出して実行するだけなら、基本Java側のデータを読みこんでなんかすることはないと思うから省いたのだろうか・・・

0 件のコメント:

コメントを投稿