PHP設計模式(二十三)—數(shù)據(jù)映射模式(Data Mapper Pattern)

數(shù)據(jù)映射模式(Data Mapper Pattern ):描述如何創(chuàng)建提供透明訪問任何數(shù)據(jù)源的對象。數(shù)據(jù)映射模式,也叫數(shù)據(jù)訪問對象模式,或數(shù)據(jù)對象映射模式。

(一)為什么需要數(shù)據(jù)映射模式

數(shù)據(jù)映射模式的目的是讓持久化數(shù)據(jù)存儲層、駐于內(nèi)存的數(shù)據(jù)表現(xiàn)層、以及數(shù)據(jù)映射本身三者相互獨立、互不依賴。這個數(shù)據(jù)訪問層由一個或多個映射器(或者數(shù)據(jù)訪問對象)組成,用于實現(xiàn)數(shù)據(jù)傳輸。通用的數(shù)據(jù)訪問層可以處理不同的實體類型,而專用的則處理一個或幾個。

(二)數(shù)據(jù)映射模式UML圖

Data Mapper Pattern

(三)簡單實例

通過數(shù)據(jù)對象映射模式,我們可以實現(xiàn)一個對象對應一條數(shù)據(jù)庫記錄,對象的屬性對應記錄的字段。但對象的屬性改變時,自動更新數(shù)據(jù)庫記錄。

例如我們有一個用戶類與數(shù)據(jù)庫的用戶表對應

<?php
//數(shù)據(jù)模式映射類
class User
{
    protected $id;
    protected $data;
    protected $db;
    protected $change = false;

    public function __construct($id)
    {   
        $this->id = $id;
        //實例化數(shù)據(jù)庫對象,這里使用了工廠方法
        $this->db = Factory::getDatabase();
        //從數(shù)據(jù)庫查詢數(shù)據(jù),存放到data屬性中
        $this->data  = $this->db->query("select * from user where id = $id limit 1");

    }

    public function __get($key)
    {
        if (isset($this->data[$key]))
        {
            return $this->data[$key];
        }
    }

    public function __set($key, $value)
    {
        $this->data[$key] = $value;
        $this->change = true;
    }
    //析構方法
    public function __destruct()
    {
        //如果對象屬性改變過,則change屬性為true 則調(diào)更新方法更新數(shù)據(jù)庫
       $this->change && $this->update();
    }
    //更新記錄方法
    public function update(){
         foreach ($this->data as $k => $v)
            {
                $fields[] = "$k = '{$v}'";
            }
            $this->db->query("update user set " . implode(', ', $fields) . "where
            id = {$this->id} limit 1");
    }
}
//實例化對象
$user = new User(1);
//改變名字
$user->name = 'admin';

如果我們要實現(xiàn)實時更新,也可以不要change屬性,直接在__set方法中調(diào)用update方法,不用等到對象銷毀前再統(tǒng)一更新。當然實時更新時更新方法可以精簡地不需要foreach,只寫更新一個字段指令就OK,但是這樣也帶來頻繁操作數(shù)據(jù)庫的問題。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容