作り途中だけど使ってみたら早速問題が出た。これを使ってできたインスタンスをセッションに入れたらエラーが出る。そりゃそうか。 定義だけするメソッドを追加。
function defineClass($name)
{
$class = "class {$name} extends DB_Object_Abstract { var \$_name = '{$name}'; }";
eval($class);
}
簡単に二重定義になったのでinclude_once的なものも追加。
function defineClassOnce($name)
{
if (!class_exists($name)) {
DB_Object::defineClass($name);
}
}
DBのconnectionが含まれてるから使うときはこんな感じで書くしかないか。
ini_set('unserialize_callback_func', 'autoload');
function autoload()
{
<strong>include_once 'DB/mysql.php';</strong>
include_once 'DB/Object.php';
DB_Object::defineClassOnce('user');
}
キモいぃ。
以下全文。
<?php
require_once 'DB.php';
class DB_Object
{
var $dsn = "";
function DB_Object($dsn = "")
{
$this->dsn = $dsn;
}
function factory($name)
{
DB_Object::defineClassOnce($name);
$obj = new $name;
$con = DB::connect($this->dsn);
$obj->_con = $con;
return $obj;
}
function defineClass($name)
{
$class = "class {$name} extends DB_Object_Abstract { var \$_name = '{$name}'; }";
eval($class);
}
function defineClassOnce($name)
{
if (!class_exists($name)) {
DB_Object::defineClass($name);
}
}
}
class DB_Object_Abstract
{
var $_con = null;
var $_res = null;
var $_name = '';
var $_key = 'id';
function get($column, $value)
{
$row = $this->_con->getRow(
"SELECT * FROM {$this->_name} WHERE $column = ?" ,
array($value),
DB_FETCHMODE_ASSOC
);
if (is_array($row)) {
foreach ($row as $name => $val) {
$this->$name = $val;
}
}
}
function insert()
{
$fields = array();
foreach ($this as $name => $value) {
if (!preg_match('/^_.*/', $name)) {
$fields[$name] = $value;
}
}
$this->_con->autoExecute($this->_name, $fields);
}
function update()
{
$fields = array();
foreach ($this as $name => $value) {
if (!preg_match('/^_.*/', $name)) {
$fields[$name] = $value;
}
}
$where = $this->_key . ' = ' . $this->{$this->_key};
$this->_con->autoExecute($this->_name, $fields, DB_AUTOQUERY_UPDATE, $where);
}
function delete()
{
$where = $this->_key . ' = ' . $this->{$this->_key};
$this->_con->query('DELETE FROM ' . $this->_name . ' WHERE ' . $where);
}
function query($sql)
{
$this->_res = $this->_con->query($sql);
}
function find()
{
}
function fetch()
{
}
}
?>
空のメソッドとか泣ける。