面倒臭がり屋のO/Rマッパー続き。

作り途中だけど使ってみたら早速問題が出た。これを使ってできたインスタンスをセッションに入れたらエラーが出る。そりゃそうか。 定義だけするメソッドを追加。

    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');
}

キモいぃ。

以下全文。

&lt;?php
require_once 'DB.php';

class DB_Object
{
    var $dsn = "";

    function DB_Object($dsn = "")
    {
        $this-&gt;dsn = $dsn;
    }

    function factory($name)
    {
        DB_Object::defineClassOnce($name);
        $obj =  new $name;
        $con = DB::connect($this-&gt;dsn);
        $obj-&gt;_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-&gt;_con-&gt;getRow(
            "SELECT * FROM {$this-&gt;_name} WHERE $column = ?" ,
            array($value),
            DB_FETCHMODE_ASSOC
        );

        if (is_array($row)) {
            foreach ($row as $name =&gt; $val) {
                $this-&gt;$name = $val;
            }
        }
    }

    function insert()
    {
        $fields = array();
        foreach ($this as $name =&gt; $value) {
            if (!preg_match('/^_.*/', $name)) {
                $fields[$name] = $value;
            }
        }
        $this-&gt;_con-&gt;autoExecute($this-&gt;_name, $fields);
    }

    function update()
    {
        $fields = array();
        foreach ($this as $name =&gt; $value) {
            if (!preg_match('/^_.*/', $name)) {
                $fields[$name] = $value;
            }
        }
        $where = $this-&gt;_key . ' = ' . $this-&gt;{$this-&gt;_key};
        $this-&gt;_con-&gt;autoExecute($this-&gt;_name, $fields, DB_AUTOQUERY_UPDATE, $where);
    }

    function delete()
    {
        $where = $this-&gt;_key . ' = ' . $this-&gt;{$this-&gt;_key};
        $this-&gt;_con-&gt;query('DELETE FROM ' . $this-&gt;_name . ' WHERE ' . $where);
    }

    function query($sql)
    {
        $this-&gt;_res = $this-&gt;_con-&gt;query($sql);
    }

    function find()
    {

    }

    function fetch()
    {

    }
}
?&gt;

空のメソッドとか泣ける。

Comments


Option