[PHP-users 14343] データベースのデータを保持するクラスの作成について

shima tetuo php-users@php.gr.jp
2003年 3月 27日 (木) 02:14:33 JST


tetuoです。

データベースのデータを保持するクラスを作成する際に以下の点でいつも悩んで
しまいます。

1.データベースからデータを取得するタイミングとそのコスト
2.データを保持するクラスはImmutableとする

最初の頃はgetterだけ持つクラスを作り、抽出対象のレコードのキーとなる項目
のみをgetData($key)のようなメソッドによりその都度データベースから取得し
ていました。

例:
class Customer{
    $_name;
    function Customer(){
        $this->_name = '';
    }
    function getData($key){
        //データ取得
        $this->_name = SQLで取得したデータ
    }
    function getName(){
        return $this->_name;
    }
}

これだと毎回Customerクラスを作るたびにデータベースに接続、データ取得と言
う処理がかかりとてもコストがかかります。


現在は試行錯誤の上、下のような感じにしています。

class Customer{
    //Javaで言う protected String name的な位置と考えます
    var $_protectedName;  
    function Customer(){
        $this->_protectedName = '';
    }
    function getName(){
        return $this->_protectedName;
    }
}

class CustomerSetter extends Customer{
    function CustomerSetter(){
        parent::Customer();
    }
    function setName($name){
        $this->_protectedName = $name;
    }
    function getCustomer(){
        //ちょっと無理がありますが...
        //クラスキャストが出来ないので...変ですね。
        $c = new Customer();
        $c->_protectedName = $this->_protectedName;
        return $c;
    }
}
class Customers{
    var $_customers;
    function Customers(){
        $this->_customers = array();
    }
    function getData(){
        //データベースから対象全てのデータを取得し
        //CustomerSetterでデータをセットし、Customerを作成する
        //1レコードずつを1オブジェクトとして_customers配列に
        //保持する
        
        $this->_customers[キーとなる項目] =&
                                $customerSetter->getCustomer();
    }
    function &getCustomer($key){
        return $this->_customers[$key];
    }
}

全体像としてはCustomersクラスで全体のデータをクラスへ置き換えます。この
際には直接Customerを作るのではなくCustomerSetterを経由して作成します。こ
れによりCustomerはImmutable(getterのみを持つと言う意味で)に保てます。
使用用途にもよりますが、データに接続するのは1回のみで全ての対象データを
取得できるので接続コストも低くなります。

こうはしてみたものの良いものとはとても思えないのが現状です。

皆さんはデータベースのデータを絡めるようなクラスはどのように作られている
のでしょうか?




PHP-users メーリングリストの案内