PHP设计模式--数据访问对象模式
? ? ? ? 最簡單的Web部件和最復(fù)雜的在線電子商務(wù)Web站點具有一個共同點:它們都要處理數(shù)據(jù)。大量的編程都設(shè)計數(shù)據(jù)的訪問和操作。隨著Internet的發(fā)展、臉頰存儲設(shè)備應(yīng)用數(shù)據(jù)的大量增長、對分析論的更深入理解以及對數(shù)據(jù)訪問的更大期待,數(shù)據(jù)以更加有趣和獨特的方式受到影響。數(shù)據(jù)訪問設(shè)計模式的目的是幫助構(gòu)造出能夠容易地處理素有這些數(shù)據(jù)的對象。
????????數(shù)據(jù)訪問對象設(shè)計模式描述了如何創(chuàng)建提供透明訪問任何對象源的對象。
????????數(shù)據(jù)訪問對象設(shè)計模式的目的是結(jié)局一下兩種特定的問題:重復(fù)與數(shù)據(jù)源抽象化。
????????
????????我們應(yīng)當(dāng)創(chuàng)建一個數(shù)據(jù)訪問對象設(shè)計模式的對象。這個數(shù)據(jù)訪問對象封裝了創(chuàng)建sQL調(diào)用、減少實例創(chuàng)建的復(fù)雜性和重復(fù)以及更新進(jìn)程的智能方式,其編寫方式應(yīng)當(dāng)是:該對象的使用者不會知道實際使用的表結(jié)構(gòu)和數(shù)據(jù)庫引擎。此外,這個對象應(yīng)用的方法應(yīng)當(dāng)使用邏輯參數(shù),并且應(yīng)處理SQL語句的創(chuàng)建工作。
????????數(shù)據(jù)訪問對象模式的額外優(yōu)點是提供數(shù)據(jù)庫抽象層。現(xiàn)在,應(yīng)用程序的主要處理代碼不再需要考慮數(shù)據(jù)庫引擎或表關(guān)系。調(diào)用這種對象的公共方法會返回任何數(shù)據(jù)類型,并且不用考慮內(nèi)在SQL需要的類型。
????????使用將非規(guī)格化表與另一個表相連接以提供特定結(jié)果集的關(guān)系數(shù)據(jù)庫結(jié)構(gòu)能夠很好地說明這個問題。如果數(shù)據(jù)庫管理員將非規(guī)格化表結(jié)構(gòu)修改為完全規(guī)格化的,那么遍布應(yīng)用程序中所有模塊的每條SQL語句都需要被修改為添加額外的連接表。如果使用數(shù)據(jù)訪問對象,那么就只需要編輯提供該信息的方法。再來看一下實績表結(jié)構(gòu)發(fā)生變化的情況:對一個列的命名可能發(fā)生變化,或者可能添加額外的列。同樣地,需要編輯代碼的仍然是數(shù)據(jù)訪問對象。SQL純粹主義者會堅決主張?zhí)砑拥谋砹袘?yīng)當(dāng)完全不影響查詢,他們認(rèn)為應(yīng)當(dāng)使用SQL語句中指定列。
????????如果編程人員沒有采用數(shù)據(jù)訪問對象設(shè)計模式,那么總是會出現(xiàn)問題。將這些對象類型的全部與易于使用相對比,無疑添加更多功能的誘惑占了統(tǒng)治地位。
????????管理數(shù)據(jù)訪問對象類中簡單性的一個好辦法是創(chuàng)建父-子關(guān)系。首先,創(chuàng)建一個基本的父對象。這個對象應(yīng)當(dāng)負(fù)責(zé)數(shù)據(jù)庫連接、抽象地執(zhí)行查詢以及與子對象通信。使用數(shù)據(jù)訪問對象設(shè)計模式時,最好開始就將一對一關(guān)系的子類與數(shù)據(jù)庫中的表相關(guān)聯(lián)。這些子類具有必不可少的信息,如表名和主鍵。此外,子類可能包含一些特定的公共方法,這些方法通過只對子類有意義的方式執(zhí)行父類的查詢。例如,名為userAddress的子類可能包含一個getAddreddesByZip()方法。將該方法放入父DAO類是毫無邏輯意義的,并且會破壞這個父類希望實現(xiàn)的抽象性。
????????處理引用特定數(shù)據(jù)庫信息的實體時,最好的做法是創(chuàng)建一個數(shù)據(jù)訪問對象。
?
1 /* 2 *MySQL數(shù)據(jù)庫擁有一條記錄,該記錄包含對每個用戶來說都是具體和特有的信息。這種功能性必須允許我們通過用戶的主鍵或?qū)τ脩裘Q的查找返回一個用戶。此外,我們必須能夠?qū)τ脩魧嶓w記錄的任意字段執(zhí)行更新操作。 3 針對此需求,需要使用兩個類:第一個類應(yīng)當(dāng)是基本數(shù)據(jù)訪問對象類,它具有獲取和更新數(shù)據(jù)方法: 4 * */ 5 6 abstract class baseDAO{ 7 private $__connection; 8 9 public function __construct(){ 10 $this->__connectionToDB(DB_USER,DB_PASS,DB_HOST,DB_DATABASE); 11 } 12 13 private function __connectToDB($user,$pass,$host,$database){ 14 $this->__connection = mysql_connection($host,$user,$pass); 15 mysql_select_db($database,$this->__connection); 16 } 17 18 public function fetch($vale,$key = NULL){ 19 if(is_null($key)){ 20 $key = $this->_primaryKey; 21 } 22 23 $sql = "select * from {$this->_tablename} where {$key} = '{$value}'"; 24 25 $results = mysql_query($sql,$this->__connection); 26 27 $rows = array(); 28 29 while($result = mysql_fetch_array($results)){ 30 $rows[] = $result; 31 } 32 33 return $rows; 34 } 35 36 37 public function update($keyedArray){ 38 $sql = "update {$this->_tableName} set "; 39 40 $updates = array(); 41 42 foreach($keyedArray as $column =>$value){ 43 $updates[] = "{$column} = '{$value}'"; 44 } 45 46 $sql .= implode(',',$updates); 47 48 $sql = " where {$this->_primaryKey} = '{$keyedArray[$this->_primaryKey]}'"; 49 50 mysql_query($sql,$this->__connection); 51 } 52 } 53 54 /* 55 這是一個抽象類,為了能夠使用該類必須擴(kuò)展該類。 56 因為很可能會同時打開多個數(shù)據(jù)庫連接,所以在數(shù)據(jù)訪問對象類中存儲內(nèi)部的數(shù)據(jù)庫連接并且每個查詢都進(jìn)行引用是十分重要的。這個數(shù)據(jù)訪問對象類應(yīng)當(dāng)唯一地引用自其自己的連接。通常,在更多可拓展的模型中,接口被創(chuàng)建用于共享連接。 57 58 */ 59 60 /* 61 任何子類都可以任意擴(kuò)展這個抽象類: 62 */ 63 64 class UserDAO extends baseDAO{ 65 protected $_tableName = "userTable"; 66 67 protected $_primaryKey = 'id'; 68 69 public function getUserByFirstName($name){ 70 $result = $this->fetch($name,'firstName'); 71 72 return $result; 73 } 74 } 75 76 /* 77 為了獲得一個起作用的數(shù)據(jù)訪問對象子實體,至少需要定義兩個受保護(hù)變量。 78 79 要使用的數(shù)據(jù)訪問對象的示例: 80 */ 81 82 define('DB_USER','user'); 83 84 define('DB_PASS','pass'); 85 86 define('DB_HOST','localhost'); 87 88 define('DB_DATABASE','test'); 89 90 $user = new userDAO(); 91 92 $userDetailsArray = $user->fetch(1); 93 94 $updates = array('id'=>1,'firstName'=>'aaron'); 95 96 $user->update($updates); 97 98 99 $allAarons = $user->getUserByFirstName('aaron');?
發(fā)現(xiàn),ThinkPHP數(shù)據(jù)庫操作底層,除了支持多種數(shù)據(jù)庫引擎外,其實原理也是采用這種數(shù)據(jù)訪問對象模式。
轉(zhuǎn)載于:https://www.cnblogs.com/fanchangfa/archive/2013/01/19/2868119.html
總結(jié)
以上是生活随笔為你收集整理的PHP设计模式--数据访问对象模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Ubuntu下Navicat 配置
- 下一篇: (转)swc与swf的区别
