PHP设计模式(四)-数据库对象映射模式


layout: post
title: "PHP设计模式(四)-数据库对象映射模式"
date: 2016-06-06 11:24:26 +0800
comments: true
categories: [php]


1、模式定义

在了解数据映射模式之前,先了解下数据映射,它是在持久化数据存储层(通常是关系型数据库)和驻于内存的数据表现层之间进行双向数据传输的数据访问层。

数据映射模式的目的是让持久化数据存储层、驻于内存的数据表现层、以及数据映射本身三者相互独立、互不依赖。这个数据访问层由一个或多个映射器(或者数据访问对象)组成,用于实现数据传输。通用的数据访问层可以处理不同的实体类型,而专用的则处理一个或几个。

数据映射模式的核心在于它的数据模型遵循单一职责原则(Single Responsibility Principle), 这也是和 Active Record 模式的不同之处。最典型的数据映射模式例子就是数据库 ORM 模型 (Object Relational Mapper)。

ha_cl表
[图片上传失败...(image-9e012e-1532594097674)]

    <?php
    namespace Baobab;
    class Hacl{
    public $id;
    public $haclname;
    public $haclcode;
    public $hacls;
    protected $db;
    function __construct($id){
    $this->db = new \Baobab\Database\Mysqli();
    $this->db->connect('127.0.0.1', 'root', '', 'test');
    $res = $this->db->query("select * from ha_cl where id = {$id}");
    $data = $res->fetch_assoc();
    $this->id = $data['ID'];
    $this->haclname = $data['ha_cl_name'];
    $this->haclcode = $data['ha_cl_code'];
    $this->hacls = $data['hacls'];
    }
    function __destruct(){
    $this->db->query("update ha_cl set
    ha_cl_code = '{$this->haclcode}',
    ha_cl_name = '{$this->haclname}',
    hacls = '{$this->hacls}'
    where ID = {$this->id}
    limit 1");
    }
    }
    //工厂模式
    <?php
    namespace Baobab;
    class Factory{
    static function getHacl($id){
    $key = 'user_'.$id;
    $user = \Baobab\Register::get($key);//表中id不同表示的是不同的对象
    if(!$user){
    $user = new \Baobab\Hacl($id);
    \Baobab\Register::set($key, $user);
    }
    return $user;
    }
    }
    <?php
    namespace Baobab;
    class Register{
    protected static $objects;
    static function set($alias, $object){
    self::$objects[$alias] = $object;
    }
    static function _unset($alias) {
    unset(self::$objects[$alias]);
    }
    static function get($name) {
    return self::$objects[$name];
    }
    }
    class Page{
    function index(){
    $hacl = Baobab\Factory::getHacl(13);
    $hacl->haclname = '测试名称';
    $this->test();
    echo 'ok';
    }
    function test(){
    $hacl = Baobab\Factory::getHacl(13);
    $hacl->hacls = '测试内容';
    }
    }
    $page = new Page();
    $page->index(); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值