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 \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");
    }

}

 

Factory.php

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

 

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 = Baobab\Factory::getHacl(13);
        $hacl->haclname = '测试名称';
        $this->test();
        echo 'ok';
    }

    function test(){
        $hacl = Baobab\Factory::getHacl(13);
        $hacl->hacls = '测试内容';
    }
}

$page = new Page();
$page->index();

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

 

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

posted @ 2020-02-17 20:52  张志健  阅读(335)  评论(0编辑  收藏  举报