简介:将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作
1.概念
将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作,这就是数据对象映射模式。
2.实际应用(实现ORM类)
假设我们有一张用户表(users)
create table users(
id int unsigned primary key auto_increment,
name varchar(100) not null comment '用户名';
mobile char(11) not null comment '手机号',
register_time int unsigned not null comment '注册时间'
)engine=innodb default charset utf8 comment '用户表';
创建一个Users类映射users表
<?php
namespace Model;
class Users {
public $id;
public $name;
public $mobile;
public $register_time;
protected $db;
public function __construct($id){
//链接数据库,下方为伪代码(大家可以结合我之前讲的适配器模式中封装的database进行结合)
$this->db = new pdo();
//查询某条数据
$res = $this->db->query("select * from users where id={$id} limit 1");
$data = $res->fetch_assoc();
//数据映射到类上
$this->id = $data['id'];
$this->name = $data['name'];
$this->mobile = $data['mobile'];
$this->register_time = $data['register_time'];
}
public function update(){
//修改表中的数据
$this->db->query("update users set name={$this->name},mobile={$this->mobile},register_time={$this->register_name} where id={$this->id}");
}
}
通过Users类修改users表的数据
<?php
use Model\Users;
$user = new Users(1);
$user->name = '测试修改名';
$user->mobile = '13145150615';
$user->register_time = time();
//执行更新操作
$user->upate();
3.数据对象模式结合工厂模式,注册模式
上面代码已经实现了基本的数据映射操作。在使用Users对象修改数据时需要实例化一个对象,那有没有什么办法可以简化呢?在之前的文章中我们介绍了工厂模式,我们这里也可以使用一个工厂模式代替实例化。除了使用工厂方法代替实例化外,我们还可以结合注册树模式,将对象存储到全局注册树上。具体代码如下所示:
<?php
namespace Factory;
use Model\Users;
//将对象实例注册到全局的一个对象树里面(注册树类)
class Register
{
//用于存储变量
public static $objects;
/**
* 将对象挂载到树上
* @param $key
* @param $obj
*/
public static function set($key,$object)
{
self::$objects[$key] = $object;
}
//需要的 时候直接从对象树种采摘下来使用
public static function get($key)
{
if (!isset(self::$objects[$key])){
return null;
}
return self::$objects[$key];
}
//注销
public static function _unset($key)
{
unset(self::$objects[$key]);
}
}
//定义注册树类
class Factory{
static function getUser($id){
//从树上获取对象,如果不存在直接实例化当前对象
$key = 'user_'.$id;
$data = Register::get($key);
if(!$data) {
$data = new Users($id);
Register::set($key, $data);
}
return $data;
}
}
在获取方式如下:
<?php
use Factory\Factory;
$user = Factory::getUser(1);
$user->name = '测试修改名';
$user->mobile = '13145150615';
$user->register_time = time();
//执行更新操作
$user->upate();
如此只需要实例化一次,这样我们就可以在多个地方使用同一个对象了。
有遗漏或者不对的可以在我的公众号留言哦