PHP设计模式-数据对象映射模式

简介:将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作

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();

如此只需要实例化一次,这样我们就可以在多个地方使用同一个对象了。

 

有遗漏或者不对的可以在我的公众号留言哦

编程经验共享公众号二维码

编程经验共享公众号二维码
更多内容关注公众号
Copyright © 2021 编程经验共享 赣ICP备2021010401号-1