PHP設計模式之數據對象映射模式

數據映射模式使您能更好的組織你的應用程序與數據庫進行交互。php

數據映射模式將對象的屬性與存儲它們的表字段間的結合密度下降。數據映射模式的本質就是一個類,它映射或是翻譯類的屬性或是方法到數據庫的相應字段,反之亦然。數據庫

數據映射的做用(工做)就在於能對雙方所呈現出的信息的理解,並能對信息的存取進行控制,如根據存儲在數據表中的信息,重建新的域對象,或是用域對象的信息來更新或刪除數據表中的相關數據。數組

對於面向對象代碼與數據庫表和字段間的映射關係的存儲有多種實現方式。其中一種可能的方法就經過手工編碼將這種映射關係存儲在數據映射類中。fetch

另外一種可選的方法是用PHP的數組並將其編碼爲類自己。這個類也能外源獲取數據,如INI或是XML文件。this

數據對象映射模式,是將對象和數據存儲映射起來,對一個對象的操做會映射爲對數據存儲的操做。編碼

User.php
<?php
class User
{
    protected $id;
    protected $data;
    protected $db;
    protected $change = false;
    function __construct($id)
    {
        $this->db = Factory::getDatabase();
        $res = $this->db->query("select * from user where id = $id limit 1");
        $this->data = $res->fetch_assoc();
        $this->id = $id;
    }
    function __get($key)
    {
        if (isset($this->data[$key]))
        {
            return $this->data[$key];
        }
    }
    function __set($key, $value)
    {
        $this->data[$key] = $value;
        $this->change = true;
    }
    function __destruct()
    {
        if ($this->change)
        {
            foreach ($this->data as $k => $v)
            {
                $fields[] = "$k = '{$v}'";
            }
            $this->db->query("update user set " . implode(', ', $fields) . "where
            id = {$this->id} limit 1");
        }
    }
}
Factory.php
<?php
class Factory
{
    static function getUser($id)
    {
        $key = 'user_'.$id;
        $user = Register::get($key);
        if (!$user) {
            $user = new User($id);
            Register::set($key, $user);
        }
        return $user;
    }
}
index.php
$db=new User(1);
$db->title='fdf';
$db->gtitle='gfdds';
<?php
class Register
{
    protected static $objects;

    static function set($alias, $object)
    {
        self::$objects[$alias] = $object;
    }

    static function get($key)
    {
        if (!isset(self::$objects[$key]))
        {
            return false;
        }
        return self::$objects[$key];
    }

    function _unset($alias)
    {
        unset(self::$objects[$alias]);
    }
}

 

注意: 能夠用魔術方法__get __set, 來實時獲取和修改某個用戶的屬性翻譯

相關文章
相關標籤/搜索