美文网首页我爱编程
php设计模式之数据映射模式

php设计模式之数据映射模式

作者: 小山人 | 来源:发表于2018-06-21 11:43 被阅读0次

    数据映射模式

    数据映射模式的目的是让持久化数据存储层,驻于内存的数据表现层以及数据映射本身三者相互独立、互不依赖.这个数据访问层由一个或多个映射器(或者数据访问对象)组成,用于实现数据传输,通用的数据访问层可以处理不同的实体类型,而专用的则处理一个或几个.
    通过数据对象映射模式,可以实现一个对象对应一条数据库记录,对象的属性对应记录的字段.但对象的属性改变时,自动更新数据库记录

    目录结构

    |dataMapper  #项目根目录
    |--Think  #核心类库
    |----Database  #数据库操作类
    |------MySQLAdapter.php  #MySQL类
    |------MySQLiAdapter.php  #MySQLi类
    |------PDOAdapter.php  #PDO类
    |----Loder.php  #自动加载类
    |----Target.php  #数据库适配器接口类
    |----User.php  #User类
    |----DataBase.php  #统一的数据库类
    |--index.php #单一的入口文件
    

    创建测试user表

    -- 创建用户表
    CREATE TABLE IF NOT EXISTS `user`(
        `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        `name` VARCHAR(30) NOT NULL DEFAULT '',
        `passwd` VARCHAR(32) NOT NULL DEFAULT '',
        `created_time` INT(10) NOT NULL DEFAULT 0
    )ENGINE=InnoDB DEFAULT CHARSET=UTF8;
    
    -- 测试数据
    INSERT INTO `user` (name, passwd, created_time) VALUES
    ('Mark', md5('12345'), UNIX_TIMESTAMP()),
    ('Lily', md5('12345'), UNIX_TIMESTAMP()),
    ('Lucy', md5('12345'), UNIX_TIMESTAMP()),
    ('Bob', md5('12345'), UNIX_TIMESTAMP()),
    ('Tom', md5('12345'), UNIX_TIMESTAMP()),
    ('Christian', md5('12345'), UNIX_TIMESTAMP());
    

    代码实现

    User类 Think/User.php

    <?php
    namespace Think;
    class User{
        protected $id;   //id
        protected $data;  //存放数据
        protected $change = false;  //判断是否修改
    
        protected $db;
    
        //构造方法,创建对象后,自动执行
        function __construct($id) {
            //数据库适配器
            $this->db = new Database\MySQLiAdapter();
            $this->db->connect('localhost','root','123456','test');
            $this->id = $id;
            $query = $this->db->query("select * from `user` where `id` = " . $id);
            $this->data = mysqli_fetch_assoc($query);
        }
    
        //获取私有属性值
        public function __get($key) {
            if(isset($this->data[$key])){
                return $this->data[$key];
            }
        }
    
        //修改私有属性值
        public function __set($key,$value) {
            //判断修改的值是否改变
            if($this->data[$key] != $value){
                $this->data[$key] = $value;
                $this->change = true;
            }
        }
    
        //更新数据
        public function update() {
            foreach ($this->data as $key=>$val){
                $fields[] = "$key = '{$val}'";
            }
            $sql = "update `user` set ".implode(', ',$fields)." where id = {$this->id}";
            $this->db->query($sql);
        }
    
    
        //析构方法,注销对象,自动执行
        function __destruct() {
            //对象属性有改变,才调用更新方法
            if($this->change) {
                $this->update();
            }
            $this->db->close();
        }
    }
    

    自动加载 Think/Loder.php

    <?php
    namespace Think;
    
    class Loder{
        static function autoload($class){
            require BASEDIR . '/' .str_replace('\\','/',$class) . '.php';
        }
    }
    

    在入口文件,修改数据 index.php

    <?php
    define('BASEDIR',__DIR__);
    include BASEDIR . '/Think/Loder.php';
    spl_autoload_register('\\Think\\Loder::autoload');
    
    $user = new \Think\User(2);
    $user->name = 'wong';
    

    上一篇 php设置模式之策略模式
    下一篇 php设计模式之观察者模式

    相关文章

      网友评论

        本文标题:php设计模式之数据映射模式

        本文链接:https://www.haomeiwen.com/subject/wgsqyftx.html