PHP5.0.4でのDTOクラスについて
MapleでDTO(Data Transfer Object)クラスを作って動かしてみたところ遷移先のページにPOSTされたデータがDTOクラスに入っていない・・・
調べてみたところ maple/core/BeanUtils.class.phpクラス内で下記のようなコードを見つけた。
function getVars(&$instance) {
$varArray = array();foreach (get_class_vars(get_class($instance)) as $key => $value) {
$varArray[strtolower($key)] = true;
}return $varArray;
}(一部省略)
function getSetterVars(&$instance) {
$vars = BeanUtils::getVars($instance);$setterVars = array();
foreach (get_class_methods(get_class($instance)) as $method) {
if (preg_match("/^set/", $method)) {
$attribute = strtolower(str_replace("set", "", $method));
if (isset($vars[$attribute])) {
$setterVars[$attribute] = true;
}
}
}return $setterVars;
}
POSTされたデータをDTOにセットするためにメンバ変数からsetterを探してるんだけど、ここで使われてるget_class_varsが問題。これはクラス内のメンバ一覧を取得するんだけど、どうやらPHP5.0.3以降はpublic属性のメンバしか取得できないようだ・・・(メソッド内から呼ぶ場合は出るみたいだけど)動作環境に上げられてるPHP5.0.2だとprivateなメンバでも表示されるようなことがどこかのMLに書いてあった。
で、自分が作ったDTOクラスを見てみると確かにメンバ変数はすべてprivate属性にしてある。本来ならこうしたほうがいいのだろうけど、こればっかりはしょうがないしな・・・
とりあえず、public属性に変更して対応するしかなさそうだ。
ExcelでDBのスキーマからDTOを生成するプログラムを書いたやつも修正する必要ありですな。