ZF框架数据对象映射模式的思考

  最近学了ZF框架,对手册中DB这一节Zend_Db_Table_Row的介绍中说,使用了Zend_Db_Table::find()或::findRow()方法可以返回一个Zend_Db_Table_Row的对象,该对象自动映射到表中的这一行记录,字段和类属性完全关联在一起(字段名是下划线分隔的,属性名由首个单词小写的驼峰式命名,如自动“last_name”,则操作时属性名“lastName”),获取任何字段就直接像操作类属性一样,如:

$row = $table->fetchRow('first_name = "Robin"');//$table是Zend_Db_Table实例
echo $row->lastName;//假设输出‘Bill’

  而修改的操作超级方便,直接对属性赋值后调用save()方法即可,如:

$row->lastName = 'Gates';
$row->save();

  数据就会自动更新到表中。之后深究了下源码,大致还是逻辑有点多,所以自己理一理,这里贴出一个简单的集成该思路的类,按照数据对象映射的模式来思考的,可以有助于理解。

<?php

/**
 * 数据对象映射模式
 *
class DataMapping
{
    protected $id;
    protected $data;
    protected $db;
    protected $change = false;

    function __construct($id)
    {
        $this->db = Factory::getDatabase();
        $res = $this->db->query("select * from user where id = $id limit 1");
        $this->data = $res->fetch_assoc();
        $this->id = $id;
    }

    function __get($key)  //实现对象操作属性的方式来操作表字段值
    {
        if (isset($this->data[$key]))
        {
            return $this->data[$key];
        }
    }

    function __set($key, $value)  //对于新的字段可以直接更新进数据表
    {
        $this->data[$key] = $value;
        $this->change = true; 
    }

    function __destruct()  //析构器的功能实现save()逻辑
    {
        if ($this->change)
        {
            foreach ($this->data as $k => $v)
            {
                $fields[] = "$k = '{$v}'";
            }
            $this->db->query("update user set " . implode(', ', $fields) . " where
            id = {$this->id} limit 1");
        }
    }
}

  

 

posted @ 2015-07-08 22:29  zjuyou  阅读(241)  评论(0编辑  收藏  举报