Maple3のBeanUtils

Maple3にはBeanUtilsというクラスがあって、そいつのメソッドのひとつにtoArrayというのがあります。こいつはオブジェクトか配列を渡すと再帰的に配列にしていくというものです。

どういう使い方をしていたかというとActionから先のビジネスロジックの処理結果をテンプレートで表示するときに、Smartyはどこまでも配列の方が扱いやすいので、何でもかんでも配列にしてしまえーってので、内部的に使ってます。まぁ、このメソッドを見つけて個別に使っている人もいるかもしれませんね。

んで、このtoArrayメソッドですが、ものすごく手抜きです。勘のいい人なら気がついていたと思いますが、循環参照しているような場合に単純に再帰をすると処理の止めどころがわからなくなります。なので、Maple3についているやつはクラス名とプロパティー名のペアで1回出てきたら再帰を止めるという手抜きをしてます(なので、時々止まってほしくないときに再帰が止まっちゃうので、ほしい値がとれないことがあります・・・)。

PHP5であればSPLをつかえばオブジェクトIDが取れるので、既に処理したオブジェクトIDならば再帰を止めるということができるのでいいのですが、PHP4はそんなことはできません・・・

んで、強引に解決したtoArrayメソッドを公開します。

http://kunit.jp/old/archives/BeanUtils.zip

どうやっているかというと処理するときに無理やり __maple4_oid というプロパティーを作って、ユニークな値をつっこんでいます。これによって、既に処理したオブジェクトを判別するという形になってます。

こちらの方が配列化の精度が高まるので、もし必要な方は利用してください(PHP5の方はSPLを使ってオブジェクトID判定部分を書き直せばいいかなと思います)。

ちなみにMaple4という識別子がついてますが、なにげに手元にはPHP4でできた新しいDIContainerの試作版があるんですよね(作ったのは昨年の夏・・・)。こいつの運命がどうなるかは・・・