• php设计模式-数据对象映射模式


    数据对象映射模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作。

    在代码中实现数据对象映射模式,实现一个ORM类,将复杂的sql语句映射成对象属性的操作。对象关系映射(Object Relational Mapping,ORM)

    就是PHP框架中的模型

    ha_cl表

    Hacl.php

    <?php
    namespace Baobab;
    
    class Hacl{
        public $id;
        public $haclname;
        public $haclcode;
        public $hacls;
        protected $db;
    
        function __construct($id){
            $this->db = new BaobabDatabaseMysqli();
            $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");
        }
    
    }

     

    Factory.php

    <?php
    namespace Baobab;
    
    class Factory{
        static function getHacl($id){
            $key = 'user_'.$id;
            $user = BaobabRegister::get($key);//表中id不同表示的是不同的对象
            if(!$user){
                $user = new BaobabHacl($id);
                BaobabRegister::set($key, $user);
            }
            return $user;
        }
    }

    Register.php

    <?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];
        }
    }

    index.php

    class Page{
        function index(){
            $hacl = BaobabFactory::getHacl(13);
            $hacl->haclname = '测试名称';
            $this->test();
            echo 'ok';
        }
    
        function test(){
            $hacl = BaobabFactory::getHacl(13);
            $hacl->hacls = '测试内容';
        }
    }
    
    $page = new Page();
    $page->index();

    使用工厂模式会多次创建对象Hacl,浪费资源,如果将对象作为参数传递,一方面会带来额外的使用成本,另外如果很多地方都用到这个对象很容易发生错误,因此在工厂模式中使用注册树模式来解决这个问题。

    原文地址:https://www.cnblogs.com/tianxintian22/p/5232016.html

  • 相关阅读:
    P2617 Dynamic Rankings 动态主席树
    P4338 [ZJOI2018]历史 LCT+树形DP
    P3348 [ZJOI2016]大森林
    P3613 睡觉困难综合征 LCT+贪心+位运算
    SP16549 QTREE6
    P3703 [SDOI2017]树点涂色 LCT维护颜色+线段树维护dfs序+倍增LCA
    U19464 山村游历(Wander) LCT维护子树大小
    P4219 [BJOI2014]大融合 LCT维护子树大小
    P2542 [AHOI2005]航线规划 LCT维护双连通分量
    P3950 部落冲突
  • 原文地址:https://www.cnblogs.com/zhangzhijian/p/12323560.html
Copyright © 2020-2023  润新知