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スクリプトで動的に吐き出すようにすれば、これでそれなりにやれるかな。