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