李長(zhǎng)齊+王菡+許海蘭



【摘要】在網(wǎng)站的設(shè)計(jì)與開發(fā)的過程中,我們需要編寫大量的代碼,并且在代碼調(diào)試、修改過程中,經(jīng)常需要對(duì)源代碼進(jìn)行編輯,整個(gè)過程相對(duì)復(fù)雜。本文將面向?qū)ο螅∣OP)的概念引入到網(wǎng)站設(shè)計(jì)與開發(fā)的過程中,使整個(gè)網(wǎng)站程序更加結(jié)構(gòu)化、更易于編寫、更易于重用、維護(hù)和擴(kuò)充。本文以php語言中的OOP為例,重點(diǎn)探討了OOP在網(wǎng)站開發(fā)過程中的應(yīng)用。
一、緒論
在信息技術(shù)飛速發(fā)展的今天,互聯(lián)網(wǎng)已經(jīng)成為人們生活的重要部分,逐步滲透到工作學(xué)習(xí)等各個(gè)方面,成為現(xiàn)代人交互信息的重要渠道。人們想要通過一個(gè)平臺(tái)來發(fā)布自己想要公開的資訊或者獲取自己需要的資訊,提供相關(guān)的網(wǎng)絡(luò)服務(wù)或者享受網(wǎng)絡(luò)服務(wù)。因此,網(wǎng)站作為為瀏覽信息的載體以及網(wǎng)絡(luò)活動(dòng)的重要節(jié)點(diǎn)應(yīng)運(yùn)而生。一所學(xué)校建立一個(gè)門戶網(wǎng)站,有利于該學(xué)校實(shí)現(xiàn)校園新聞的動(dòng)態(tài)發(fā)布、校園教學(xué)資源的共享、校園風(fēng)景的展示以及信息的反饋,還有利于該高校這個(gè)專業(yè)建設(shè)成果的宣傳和推廣,專業(yè)建設(shè)工作的展示,提供個(gè)性化學(xué)習(xí)的平臺(tái),給學(xué)校教學(xué)研究帶來了一片新天地,也有利于幫助學(xué)校形成自己的特色與品牌。
一些發(fā)達(dá)國(guó)家非常重視教育網(wǎng)站的設(shè)計(jì)與實(shí)現(xiàn),他們認(rèn)為,學(xué)校打造網(wǎng)站是學(xué)校的軟實(shí)力表現(xiàn),一個(gè)高校有越多教育網(wǎng)站,那它的軟實(shí)力就越強(qiáng)。瀏覽國(guó)外的一些教育類的網(wǎng)站,布局新穎、有創(chuàng)意、特色鮮明、文化氣息濃郁、清晰、美感、有活力。隨著我國(guó)教育的發(fā)展,國(guó)內(nèi)也越來越重視教育網(wǎng)站的建設(shè),逐步呈現(xiàn)出多層次,多元化的趨勢(shì),對(duì)教育網(wǎng)站的投資力度也正在逐步加大。
設(shè)計(jì)與實(shí)現(xiàn)一個(gè)網(wǎng)站,包括前期需求分析確定風(fēng)格和內(nèi)容,中期靜態(tài)網(wǎng)站的設(shè)計(jì)以及代碼編寫搭建數(shù)據(jù)庫實(shí)現(xiàn)動(dòng)態(tài),后期的測(cè)試上線幾個(gè)部分。其中代碼的編寫是比較繁瑣,困難和重要的環(huán)節(jié)。對(duì)于瀏覽網(wǎng)站的用戶而言,看到的只是網(wǎng)站的頁面,他們不需要也看不到支撐整個(gè)網(wǎng)站運(yùn)行的程序代碼,但是代碼的編寫,在網(wǎng)站建設(shè)的過程中是必不可少的。一個(gè)設(shè)計(jì)得再漂亮的網(wǎng)頁,如果沒有程序代碼的支撐,那它只不過是繡花枕頭一個(gè),只能看,不能實(shí)現(xiàn)任何功能。
想要實(shí)現(xiàn)同一種功能,不同的程序員可能寫出不同的代碼,當(dāng)然,編寫的代碼一定是越簡(jiǎn)潔、越流暢越好。在信息技術(shù)飛速發(fā)展的今天,隨著計(jì)算機(jī)應(yīng)用的不斷擴(kuò)大,對(duì)計(jì)算機(jī)技術(shù)的要求也越來越高,結(jié)構(gòu)化程序設(shè)計(jì)語言已無法滿足用戶需求的變化。OOP的程序設(shè)計(jì)方法,具有數(shù)據(jù)封裝、繼承和多態(tài)的特點(diǎn),使程序更加結(jié)構(gòu)化、更易于編寫、更易于重用、維護(hù)和擴(kuò)充,能夠有效提高代碼的質(zhì)量。與國(guó)外相比,我國(guó)在OOP技術(shù)方面的研究雖然起步較晚,但也取得了一定成果。深圳大學(xué)譚也平博士曾研究過OOP技術(shù)在結(jié)構(gòu)電算中的應(yīng)用。今天,利用OOP進(jìn)行編程的方法正在成為國(guó)內(nèi)外程序設(shè)計(jì)的主流,其思想已經(jīng)涉及到軟件開發(fā)的各個(gè)方面,例如面向?qū)ο蟮姆治觥⒚嫦驅(qū)ο蟮脑O(shè)計(jì)等。
二、OOP在教育網(wǎng)站開發(fā)過程中應(yīng)用的優(yōu)勢(shì)
OOP(Object Oriented Programming)面向?qū)ο蟮某绦蛟O(shè)計(jì),是一種以對(duì)象為基礎(chǔ),以事件或者消息來驅(qū)動(dòng)對(duì)象來執(zhí)行處理的程序設(shè)計(jì)技術(shù)。這種基于對(duì)象的編程方式更符合人的思維模式,編寫的程序也會(huì)更加健壯和強(qiáng)大。使人們可以編寫出易于維護(hù),易于擴(kuò)展和易于重用的程序代碼。
1、對(duì)象(Object)
在現(xiàn)實(shí)世界中,對(duì)象指某個(gè)實(shí)際存在的事物。它可以是有形的(比如一臺(tái)電腦)也可以是無形的(比如一個(gè)目標(biāo))。它表達(dá)了客觀世界真實(shí)的實(shí)體或抽象的東西。
在計(jì)算機(jī)編程領(lǐng)域中,對(duì)象是一個(gè)封閉體,它是由一組數(shù)據(jù)和施加在這組數(shù)據(jù)中的一系列的操作構(gòu)成的整體。使用new來創(chuàng)建對(duì)象。
2、類(class)
類是一組具有相同的數(shù)據(jù)和相同結(jié)構(gòu)的對(duì)象集合,是所有相似對(duì)象的狀態(tài)變量和行為構(gòu)成的模板,面向?qū)ο缶幊讨校嬲瓿筛黜?xiàng)工作的是類,用class來定義類。在現(xiàn)實(shí)世界中,我們時(shí)刻都在和具體的實(shí)物打交道,例如汽車、卡車、轎車等,它們往往涉及可以承載的人數(shù)、速度、發(fā)動(dòng)機(jī)功率、耗油量等等幾個(gè)方面。這些方面共同構(gòu)成一個(gè)概念——機(jī)動(dòng)車。那么一輛小汽車就是機(jī)動(dòng)車類的一個(gè)實(shí)例了,也就是一個(gè)具體的對(duì)象。
3、OOP的特征
(1)封裝
封裝實(shí)質(zhì)上就是信息隱藏,把編程的過程和數(shù)據(jù)包圍起來,隱藏實(shí)現(xiàn)細(xì)節(jié), 將屬性私有化,對(duì)數(shù)據(jù)的訪問只能通過已定義的界面。通過改變可見性來保護(hù)封裝數(shù)據(jù)。PHP的三種可見性:private(私有)、protected(保護(hù))、public(公共)。通常用private來封裝一個(gè)程序元素,它只能在類內(nèi)被訪問。
(2)繼承
一個(gè)新類從另一個(gè)類中派生,并且擁有這個(gè)類的所有屬性和方法。新派生的類還可以定義新的屬性和方法。在不改動(dòng)的基礎(chǔ)上對(duì)原程序進(jìn)行擴(kuò)充,使得原屬性和方法得以保存,而方法也得以擴(kuò)展。這有利于減少重復(fù)編碼,提高編程的開發(fā)效率。在面向?qū)ο蟮木幊讨斜焕^承的類叫基類或父類,繼承類叫派生類或子類。繼承使用關(guān)鍵字extend。
(3)多態(tài)
多態(tài),即多種形態(tài),允許不同類的對(duì)象對(duì)同一消息作出響應(yīng)。在面向?qū)ο缶幊讨卸鄳B(tài)的實(shí)質(zhì)是,調(diào)用有相同接口的對(duì)象來完成不同的工作。
(4)抽象
抽象(abstraction)是指一個(gè)對(duì)象的基本特征,使它與其它的對(duì)象區(qū)分開來,抽象是復(fù)雜性的主要工具。如果一個(gè)類是抽象的,那它不能被實(shí)例化成對(duì)象,只能被具體的子類繼承。如果一個(gè)類至少有一個(gè)抽象方法,那它一定是一個(gè)抽象類。
4、OOP技術(shù)的優(yōu)勢(shì)分析
在OOP出現(xiàn)之前,編程人員用面向過程的方法開發(fā)程序。這種面向過程的編程方法以過程為基礎(chǔ),把密切相關(guān)且相互依賴的數(shù)據(jù)的操作相互分離,這使得一些復(fù)雜龐大的程序難于編寫,而且難于調(diào)用和修改。在多個(gè)程序員合作的情況下,很難讀懂對(duì)方的代碼,也難以重用和維護(hù)。
面向?qū)ο笫且怨δ軄韯澐謫栴}的,面向過程是以步驟來劃分問題的。面向?qū)ο笤诠δ苌媳WC了設(shè)計(jì)的可擴(kuò)展性。相對(duì)于面向過程,面向?qū)ο蟮膬?yōu)勢(shì)可以歸納為:endprint
(1)容易維護(hù)
面向?qū)ο笏枷朐O(shè)計(jì)的程序,可讀性比較高,因其具有繼承性,要適應(yīng)隨時(shí)改變的需求,修改的也只是局部的模塊,所以維護(hù)起來成本較低也比較方便。
(2)代碼質(zhì)量高
應(yīng)用面向?qū)ο笏枷朐O(shè)計(jì)的程序,重用性比較高,從而有效提高網(wǎng)頁制作的進(jìn)度、減少網(wǎng)絡(luò)流量,提高瀏覽速度等。
(3)效率高
在網(wǎng)站建設(shè)時(shí),根據(jù)設(shè)計(jì)的需要對(duì)程序進(jìn)行抽象,產(chǎn)生類。用人容易理解的方式對(duì)復(fù)雜系統(tǒng)進(jìn)行分析、設(shè)計(jì)與編程,對(duì)網(wǎng)頁制作的研究有著重要的現(xiàn)實(shí)意義。
(4)容易擴(kuò)展
由于面向?qū)ο蟪橄蟆⒎庋b、繼承、多態(tài)的特征,設(shè)計(jì)的程序具有高內(nèi)聚,低耦合的性能,使得程序設(shè)計(jì)更靈活、更易于擴(kuò)展。
三、OOP在網(wǎng)站設(shè)計(jì)中的應(yīng)用
在將OOP概念應(yīng)用到網(wǎng)站設(shè)計(jì)的過程中我們需要一個(gè)具體的網(wǎng)站設(shè)計(jì)作為案例,本文以我校的生物科學(xué)網(wǎng)站設(shè)計(jì)為例,為用戶提供網(wǎng)站內(nèi)容管理和信息發(fā)布。網(wǎng)站要求實(shí)現(xiàn)后臺(tái)管理功能和信息發(fā)布功能,通過后臺(tái)內(nèi)容管理系統(tǒng)實(shí)現(xiàn)各種資源的管理使用,包括文字、圖像、視頻等,最終通過前臺(tái)將信息呈現(xiàn)給用戶。本網(wǎng)站主要面向三個(gè)不同層次的用戶,管理員、教師和學(xué)生,層次不同,權(quán)限不同、需求也不同。管理員是整個(gè)網(wǎng)站具有最高權(quán)限的角色,能進(jìn)行用戶管理、數(shù)據(jù)庫管理、模塊管理等。教師能夠進(jìn)行模塊管理,如公告的發(fā)布、資料的上傳和刪除等。學(xué)生是權(quán)限最低的用戶,是網(wǎng)站發(fā)布信息的瀏覽者,能夠查閱、檢索和下載資源。
1、網(wǎng)站需求分析
界面風(fēng)格相對(duì)溫和,能夠有明顯的生物學(xué)特色,界面清晰、美觀,能夠讓用戶快速方便的找到相應(yīng)的功能,需要圖片新聞、文章發(fā)表、專業(yè)簡(jiǎn)介、師資隊(duì)伍、超鏈接圖標(biāo)等幾個(gè)模塊,網(wǎng)站的整體色調(diào)是淡藍(lán)色,上下包圍的板式效果。
2、網(wǎng)站總體設(shè)計(jì)
將網(wǎng)站的總體架構(gòu)設(shè)計(jì)成三層結(jié)構(gòu),分別是用戶層、業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層,如圖3-1所示:
圖3-1 生物科學(xué)網(wǎng)站分層結(jié)構(gòu)圖
3、網(wǎng)站的功能模塊設(shè)計(jì)
該生物科學(xué)網(wǎng)站分為前臺(tái)用戶和后臺(tái)管理兩大系統(tǒng),前臺(tái)包括圖片新聞、專業(yè)概述、建設(shè)目標(biāo)、師資隊(duì)伍、通知公告、人才培養(yǎng)、教學(xué)條件、成果展示、資料下載、聯(lián)系我們幾個(gè)模塊,其中圖片新聞、人才培養(yǎng)、通知公告和成果展示為動(dòng)態(tài),其余均為靜態(tài)。后臺(tái)管理部分包括用戶管理、新聞管理、文章管理、教學(xué)資料管理等幾個(gè)模塊,網(wǎng)站模塊結(jié)構(gòu)如圖3-2所示。
圖3-2 網(wǎng)站模塊結(jié)構(gòu)圖
4、數(shù)據(jù)庫設(shè)計(jì)
網(wǎng)站的后臺(tái)支持是以網(wǎng)站的數(shù)據(jù)庫為基礎(chǔ)的,當(dāng)一個(gè)網(wǎng)站的系統(tǒng)設(shè)計(jì)部分完成之后,就需要進(jìn)一步設(shè)計(jì)具體數(shù)據(jù)結(jié)構(gòu)。網(wǎng)站的后臺(tái)服務(wù)程序能夠在數(shù)據(jù)庫中根據(jù)訪問者提供的查詢條件搜索數(shù)據(jù),并將搜索結(jié)果或數(shù)據(jù)經(jīng)過整理返回訪問者。
根據(jù)網(wǎng)站的設(shè)計(jì)規(guī)劃出管理員、教師和學(xué)生三個(gè)實(shí)體,通過分析它們之間的關(guān)系,為后面分析數(shù)據(jù)的流動(dòng)和邏輯結(jié)構(gòu)打下基礎(chǔ)。
圖3-5 實(shí)體E-R圖
四、OOP在網(wǎng)站實(shí)現(xiàn)中的應(yīng)用
1、環(huán)境搭建
在Windows下搭建PHP開發(fā)環(huán)境,首先安裝和配置Apache服務(wù)器,Apache服務(wù)器順利啟動(dòng)后,接下來安裝和配置PHP,PHP配置完成后,重新啟動(dòng)Apache服務(wù)器,最后安裝MySQL服務(wù)器。
2、數(shù)據(jù)庫實(shí)現(xiàn)
成功登錄MySQL數(shù)據(jù)庫后,即可在命令提示符窗口對(duì)MySQL數(shù)據(jù)庫進(jìn)行管理,執(zhí)行創(chuàng)建、查看、更改和刪除MySQL數(shù)據(jù)庫和數(shù)據(jù)表等操作。
3、連接數(shù)據(jù)庫
由于大部分模塊都需要使用數(shù)據(jù)庫,如果每個(gè)模塊都編寫相同的數(shù)據(jù)庫連接代碼,不僅會(huì)加大工作量而且會(huì)顯得十分繁瑣,所以應(yīng)用面向?qū)ο蟮乃枷耄瑢?shù)據(jù)庫連接代碼作為一個(gè)對(duì)象單獨(dú)寫入一個(gè)PHP文件DB.class.php中,在需要與數(shù)據(jù)庫連接的頁面中,使用包含語句調(diào)用該文件即可,無需重復(fù)編寫相同的代碼,減少代碼冗余。連接數(shù)據(jù)庫的部分實(shí)現(xiàn)代碼如下:
Conn.php
<?php
//數(shù)據(jù)庫連接類
class DB {
//獲取對(duì)象句柄
static public function getDB() {
$_mysqli = new mysqli(DB_HOST,DB_USER,DB_PASS,DB_NAME);
if (mysqli_connect_errno()) {
echo '數(shù)據(jù)庫連接錯(cuò)誤!錯(cuò)誤代碼:'.mysqli_connect_error();
exit();
}
$_mysqli->set_charset('utf8');
return $_mysqli;
}
//清理
static public function unDB(&$_result, &$_db) {
if (is_object($_result)) {
$_result->free();
$_result = null;
}
if (is_object($_db)) {
$_db->close();
$_db = null;
}
}
}
?>
調(diào)用數(shù)據(jù)庫文件的主要代碼如下:
<?php include 'DB.class.php'; ?>
4、基于OOP的思想對(duì)網(wǎng)站的目錄和文件進(jìn)行實(shí)現(xiàn)
應(yīng)用面向?qū)ο蟮乃枷脒M(jìn)行編程,生成的主要文件圖4-1所示。endprint
圖4-1 主要文件關(guān)系圖
index.php存放在主業(yè)務(wù)邏輯層
template.inc.php模板初始文件
templates 文件夾用來存放所有的模板文件
templates_c存放模板編譯文件
cache存放所有的緩存文件
includes 用來存放所有的類文件和包含文件
config存放系統(tǒng)變量配置文件和系統(tǒng)文件
language語言的文件夾
主要代碼的實(shí)現(xiàn)
(1)用戶登錄功能的實(shí)現(xiàn)
Login.php文件,存放在主業(yè)務(wù)邏輯層,主要用一些if語句來驗(yàn)證存儲(chǔ)在數(shù)據(jù)庫里的用戶信息,驗(yàn)證正確則登錄成功。
private function login() {
if (isset($_POST['send'])) {
if (Validate::checkLength($_POST['code'],4,'equals')) Tool::alertBack('警告:驗(yàn)證碼必須是四位!');
if (Validate::checkEquals(strtolower($_POST['code']),$_SESSION['code'])) Tool::alertBack('警告:驗(yàn)證碼不正確!');
if (Validate::checkNull($_POST['admin_user'])) Tool::alertBack('警告:用戶名不得為空!');
if (Validate::checkLength($_POST['admin_user'],2,'min')) Tool::alertBack('警告:用戶名不得小于兩位!');
if (Validate::checkLength($_POST['admin_user'],20,'max')) Tool::alertBack('警告:用戶名不得大于20位!');
if (Validate::checkNull($_POST['admin_pass'])) Tool::alertBack('警告:密碼不得為空!');
if (Validate::checkLength($_POST['admin_pass'],6,'min')) Tool::alertBack('警告:密碼不得小于六位!');
$this->_model->admin_user = $_POST['admin_user'];
$this->_model->admin_pass = sha1($_POST['admin_pass']);
$_login = $this->_model->getLoginManage();
if ($_login) {
$_SESSION['admin']['admin_user'] = $_login->admin_user;
$_SESSION['admin']['level_name'] = $_login->level_name;
Tool::alertLocation(null, 'admin.php');
} else {
Tool::alertBack('警告:用戶名或密碼錯(cuò)誤!');}
}
}
(2)圖片新聞瀏覽功能的實(shí)現(xiàn)
Vew.php文件存放在主業(yè)務(wù)邏輯層下,通過SQL語句查詢存儲(chǔ)在數(shù)據(jù)庫的圖片新聞。
<?php
$sql="select biaoti,id,addtime from sw where leibie='教學(xué)新聞' order by id desc";
$query=mysql_query($sql);
$rowscount=mysql_num_rows($query);
if($rowscount>0)
{
for($i=0;$i<$rowscount;$i++)
{if($i==10)
{break ;}
}
?>
(3)文件上傳功能的實(shí)現(xiàn)
Upfile.php文件存放在主業(yè)務(wù)邏輯層下,用于上傳文件。
<?php
//上傳文件類
class FileUpload {
private $error; //錯(cuò)誤代碼
private $maxsize; //表單最大值
private $type; //類型
private $typeArr = array('image/jpeg','image/pjpeg','image/png','image/x-png','image/gif'); //類型合集
private $path; //目錄路徑
private $today; //今天目錄
private $name; //文件名
private $tmp; //臨時(shí)文件
private $linkpath; //鏈接路徑
private $linktotay; //今天目錄(相對(duì))
//構(gòu)造方法,初始化
public function __construct($_file,$_maxsize) {endprint
$this->error = $_FILES[$_file]['error'];
$this->maxsize = $_maxsize / 1024;
$this->type = $_FILES[$_file]['type'];
$this->path = ROOT_PATH.UPDIR;
$this->linktotay = date('Ymd').'/';
$this->today = $this->path.$this->linktotay;
$this->name = $_FILES[$_file]['name'];
$this->tmp = $_FILES[$_file]['tmp_name'];
$this->checkError();
$this->checkType();
$this->checkPath();
$this->moveUpload();
}
//返回路徑
public function getPath() {
$_path = $_SERVER["SCRIPT_NAME"];
$_dir = dirname(dirname($_path));
if ($_dir == '\\') $_dir = '/';
$this->linkpath = $_dir.$this->linkpath;
return $this->linkpath;
}
//移動(dòng)文件
private function moveUpload() {
if (is_uploaded_file($this->tmp)) {
if (!move_uploaded_file($this->tmp,$this->setNewName())) {
Tool::alertBack('警告:上傳失敗!');
}
} else {
Tool::alertBack('警告:臨時(shí)文件不存在!');
}
}
//設(shè)置新文件名
private function setNewName() {
$_nameArr = explode('.',$this->name);
$_postfix = $_nameArr[count($_nameArr)-1];
$_newname = date('YmdHis').mt_rand(100,1000).'.'.$_postfix;
$this->linkpath = UPDIR.$this->linktotay.$_newname;
return $this->today.$_newname;
}
//驗(yàn)證目錄
private function checkPath() {
if (!is_dir($this->path) || !is_writeable($this->path)) {
if (!mkdir($this->path)) {
Tool::alertBack('警告:主目錄創(chuàng)建失敗!');
}
}
if (!is_dir($this->today) || !is_writeable($this->today)) {
if (!mkdir($this->today)) {
Tool::alertBack('警告:子目錄創(chuàng)建失敗!');
}
}
}
//驗(yàn)證類型
private function checkType() {
if (!in_array($this->type,$this->typeArr)) {
Tool::alertBack('警告:不合法的上傳類型!');
}
}
//驗(yàn)證錯(cuò)誤
private function checkError() {
if (!empty($this->error)) {
switch ($this->error) {
case 1 :
Tool::alertBack('警告:上傳值超過了約定最大值!');
break;
case 2 :
Tool::alertBack('警告:上傳值超過了'.$this->maxsize.'KB!');
break;
case 3 :
Tool::alertBack('警告:只有部分文件被上傳!');
break;
case 4 :
Tool::alertBack('警告:沒有任何文件被上傳!');
break;
default:
Tool::alertBack('警告:未知錯(cuò)誤!');
}
}
}
}
?>
五、結(jié)論
OOP的概念逐步滲透到編程的過程當(dāng)中并漸漸取代面向過程的編程,是每個(gè)程序員在開發(fā)程序時(shí)都要深入考慮的概念,它能夠?qū)⒕W(wǎng)站中的文件和功能分離開,提高了代碼的重用性。本文通過針對(duì)基于OOP技術(shù)網(wǎng)站的設(shè)計(jì)與實(shí)現(xiàn)現(xiàn)狀進(jìn)行分析,主要介紹OOP的概念在網(wǎng)站開發(fā)過程中的優(yōu)勢(shì)、在網(wǎng)站OOP設(shè)計(jì)過程中的應(yīng)用和在網(wǎng)站開發(fā)過程中的優(yōu)勢(shì)。由于篇幅的限制本文在OOP在網(wǎng)站開發(fā)中的應(yīng)用只做了部分案例進(jìn)行探討。
參考文獻(xiàn):
[1]吳煒煜.面向?qū)ο蠓治鲈O(shè)計(jì)與編程OOA/OOD/OOP/AOP[M].北京:清華大學(xué)出版社,2015:50-43
[2]William Sanders.蘇金國(guó),王宇飛.Learning PHP設(shè)計(jì)模式[M].北京:中國(guó)電力出版社,2015:25-44
[3]耿秋義,張躍平.Java面向?qū)ο蟪绦蛟O(shè)計(jì).第二版[M].北 京:北京郵電大學(xué)出版社,2013:20-34
[4]孫紅亮.基于三層架構(gòu)的校園網(wǎng)站設(shè)計(jì)與實(shí)現(xiàn)[D].河北: 河北師范大學(xué),2013.
[5]王飛飛.MySQL數(shù)據(jù)庫應(yīng)用從入門到精通[M].北京:中國(guó)鐵道出版社,2015:126-130endprint