[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 メーリングリストの案内