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