日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

《PHP設計模式介紹》第十四章 動態(tài)記錄模式_PHP教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦:《PHP設計模式介紹》第十三章 適配器模式
接口的改變,是一個需要程序員們必須(雖然很不情愿)接受和處理的普遍問題。程序提供者們修改他們的代碼;系統(tǒng)庫被修正;各種程序語言以及相關庫的發(fā)展和進化。我孩子的無數(shù)玩具中有一個簡要地描

到目前為止,您所看到的這些設計模式大大提高了代碼的可讀性與可維護性。然而,在WEB應用設計與開發(fā)中一個基本的需求與挑戰(zhàn):數(shù)據(jù)庫應用,這些設計模式都沒有涉及到。本章與接下來的兩章—表數(shù)據(jù)網(wǎng)關與表數(shù)據(jù)映射,提供了三種設計模式使您能更好的組織你的應用程序與數(shù)據(jù)庫進行交互。

問題

大多數(shù)WEB應用將信息持續(xù)保存在數(shù)據(jù)庫中。有將數(shù)據(jù)庫操作抽象化,以達到簡化表數(shù)據(jù)存取和對業(yè)務邏輯的集成存取方法嗎?

解決方案

理論上,動態(tài)記錄模式是最簡化的有關數(shù)據(jù)庫的設計模式。動態(tài)記錄模式包含了如何在類中直接實現(xiàn)與數(shù)據(jù)庫交互的相關知識。

動態(tài)記錄模式在程序代碼與數(shù)據(jù)庫結構之間產(chǎn)生了一種很高的結合度,在一些相對簡單的應用環(huán)境中,就能比采用別的復雜方案更容易解決這種因結合所產(chǎn)生的一些固有問題。動態(tài)記錄模式也能滿足許多初級的數(shù)據(jù)庫項目。只有當復雜性增加而難以用動態(tài)記錄模式處理時,你才有必要使用表數(shù)據(jù)網(wǎng)關模式(參見15章),或是數(shù)據(jù)地圖模式(參見16章)或是別的數(shù)據(jù)庫設計模式

企業(yè)級應用架構模式

根據(jù)Martin Fowler’s的著作《企業(yè)級應用架構模式》,所謂企業(yè)級應用就是與別的應用集成化,包含了重要的業(yè)務邏輯(或如應用需求所呈現(xiàn)的非邏輯的東西),并且具有許多并發(fā)存取和保存從各種接口取得的數(shù)據(jù)。有趣的是,web應用正好具備了上述多個特點,這正好能解釋為什么Martin Fowler’s的著作能引起PHP程序員的強烈反響。

PHP數(shù)據(jù)對象

PDO是一個高性能的數(shù)據(jù)庫通道接口(并非數(shù)據(jù)庫抽象)。PDO是一個由C語言構成的本地驅動包,因此其速度是很快的。PDO為所有的PDO驅動提供了申明,增強了腳本使用庫時的安全性。

樣本代碼

任何對數(shù)據(jù)庫連接的討論都依賴于對數(shù)據(jù)庫系統(tǒng)與對數(shù)據(jù)庫訪問層的選擇。本章與隨后兩章都使用MYSQL(http://www.mysql.com/)這個流行的開源數(shù)據(jù)庫及ADOdb (http://adodb.sf.net/)作為數(shù)據(jù)庫訪問層。我將ADOdb作為我自己工作室的標準是因為它優(yōu)異的性能,且抽象了Oracle OCI接口,并提供了統(tǒng)一的訪問PostgreSQL, Sybase, MySQL和其它數(shù)據(jù)庫的接口,而成為了易于使用的PHP API,讓你專注于程序與業(yè)務邏輯的處理。

放心的替換你的自己的數(shù)據(jù)庫與訪問層,因為這里提出的許多概念也適合于別的解決方案。

在研究t動態(tài)記錄模式之前,讓我們從基本的數(shù)據(jù)庫連接開始。有一個集中的,簡單的方式去指定連接參數(shù)(主機名,用戶名,密碼,數(shù)據(jù)庫)并建立一個數(shù)據(jù)庫連接對象是很理想的。一個單一模式對象(參見第四章)就非常適合了。

這是一個DB類,其conn()方法返回一個單一模式的ADOConnection類的實例。

// PHP5
require_once ‘adodb/adodb.inc.php’;
class DB {
//static class, we do not need a constructor private function __construct() {}
public static function conn() {
static $conn;
if (!$conn) {
$conn = adoNewConnection(‘mysql’);
$conn->connect(‘localhost’, ‘username’, ‘passwd’, ‘database’);
$conn->setFetchMode(ADODB_FETCH_ASSOC);
}
return $conn;
}
}

DB類允許你設定數(shù)據(jù)庫的類型與連接參數(shù)。第一行代碼將ADOdb庫包含進來(你可能需要根據(jù)你的實際環(huán)境來調整路徑);因為沒有必要每次都實例化DB,所以DB的構造函數(shù)是私有的; 行$conn->setFetchMode(ADODB_FETCH_ASSOC)設定對象返回的記錄集是以(字段名=>值)形式的關聯(lián)數(shù)組。與數(shù)據(jù)庫打交道中采用關聯(lián)數(shù)組是非常重要的經(jīng)驗習慣,這樣您的代碼就不會受到因SQL語句中字段排序而產(chǎn)生的影響。

作為示例程序,讓我們建立一個Active Record對象來維護一個超鏈接表。以下是一個在MySQL數(shù)據(jù)庫中建立這個超鏈接表的SQL。

define(‘BOOKMARK_TABLE_DDL’, <<<EOS
CREATE TABLE `bookmark` (
`id` INT NOT NULL AUTO_INCREMENT ,
`url` VARCHAR( 255 ) NOT NULL ,
`name` VARCHAR( 255 ) NOT NULL ,
`description` MEDIUMTEXT,
`tag` VARCHAR( 50 ) ,
`created` DATETIME NOT NULL ,
`updated` DATETIME NOT NULL , PRIMARY KEY ( `id` )
) EOS
);

實驗的獨立性

各個實驗間應是相互獨立的;否則,僅僅是運行了某一個實驗就會影響到后續(xù)實驗的結果。

為了避免這些都基于同一數(shù)據(jù)庫的實驗間相互干擾,最好是在每個測試開始前刪除并重建相關表。以下簡單的實驗為后續(xù)實驗提供了一種標準的setup方法。

以下代碼演示如何在每個實驗開始前重置你的數(shù)據(jù)庫:

class ActiveRecordTestCase extends UnitTestCase {
protected $conn;
function __construct($name=’’) {
$this->UnitTestCase($name);
$this->conn = DB::conn();
}
function setup() {
$this->conn->execute(‘drop table bookmark’);
$this->conn->execute(BOOKMARK_TABLE_DDL);
}
}

這段代碼用一個標準的ADOConnection對象來給$conn的屬性賦值,并且使用了Connection的execute()方法來執(zhí)行SQL刪除與重建表的操作。因為這些代碼在一個名為setup()的方法中,使得每一個實驗都能在一個新的數(shù)據(jù)庫環(huán)境中工作。

分享:《PHP設計模式介紹》第十二章 裝飾器模式
若你從事過面向對象的php開發(fā),即使很短的時間或者僅僅通過本書了解了一些,你會知道,你可以 通過繼承改變或者增加一個類的功能,這是所有面向對象語言的一個基本特性。如果已經(jīng)存在的一個php

共6頁上一頁123456下一頁
來源:模板無憂//所屬分類:PHP教程/更新時間:2008-08-22
相關PHP教程