ActiveRecordっぽいアプローチ
RailsのO/RマッパであるActiveRecordでは、newでオブジェクトを作ってからsave()でDBに保存したり、find()みたいなstaticメソッドでDBからオブジェクトに落としたりできます。phpで書くとこんな感じ。
// 新しいユーザMikeを作成 $mike = new User(); $mike->name = 'Mike'; $mike->save(); // id:3なユーザ(John)を取得 $john = User::find(3);
ところが、こういう仕事をしてくれるクラスを実際に作るとなると、いい具合にいきません。find()などのメソッドはUserクラスの親となるクラスで宣言して、他のModelでも使い回したいところですが、「PHP-users 31113 メソッドの静的呼び出しについて」のような問題があるため、素直に書くとドツボです。このあたりの話は以前から出ているらしく、「Zend FrameworkにActiveRecord相当のクラスがない理由」で詳しい経緯が紹介されています。私の今いる場所は、既に2000年前に通過された場所だッッッ!!
で、どうしたかと言うと、
class User extends ORM { function find(…) { return parent::_find(__CLASS__, 'テーブル名', …); } } class ORM { function _find($class, $tbl, …) { // DBから$rowにレコード取得 $obj = new $class($row); return $obj; } }
てな具合に逃げてみました。User.class.phpをスクリプトで動的に吐き出すようにすれば、これでそれなりにやれるかな。