DPT-一種PHP設(shè)計(jì)模式_第1頁
DPT-一種PHP設(shè)計(jì)模式_第2頁
DPT-一種PHP設(shè)計(jì)模式_第3頁
DPT-一種PHP設(shè)計(jì)模式_第4頁
DPT-一種PHP設(shè)計(jì)模式_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、一、DPT介紹PHP為什么在主流的應(yīng)用中總是那么不出色,總是不如.Net/Java,就是因?yàn)樵赑HP處理大型應(yīng)用的時(shí)候,那些不完整的面向?qū)ο髾C(jī)制、數(shù)據(jù)庫處理的單一,不通用性等等,影響了PHP做大型應(yīng)用。那么,如何來改變這個(gè)狀況呢?當(dāng)然就是需要引進(jìn)一些新的設(shè)計(jì)方法,把PHP中不健全的面向?qū)ο髾C(jī)制完整起來,進(jìn)行更好的PHP大中型應(yīng)用的開發(fā)。從Java過來的MVC模式非常流行,而且已經(jīng)有部分已經(jīng)引伸進(jìn)了PHP領(lǐng)域,設(shè)計(jì)模式的引進(jìn),就是為了更好的控制項(xiàng)目開發(fā)。今天我要說一種設(shè)計(jì)模式,類似于MVC,它叫DPT模式。其實(shí)有時(shí)候我也覺得有點(diǎn)象Java里面的DAO(Data Access Object),不過

2、DAO是夾在業(yè)務(wù)邏輯層和數(shù)據(jù)庫資源層之間的,而DPT更多的是把業(yè)務(wù)邏輯也封裝在類里,和DAO層在相同的內(nèi)容中。D Data,數(shù)據(jù)收集層P Php,PHP數(shù)據(jù)調(diào)用層T Template,模板層首先,我們要對它進(jìn)行簡單的了解。Data,就是我們的數(shù)據(jù)層,它不是數(shù)據(jù)庫抽象類,而是通過數(shù)據(jù)庫接口,執(zhí)行一些SQL,把數(shù)據(jù)獲取的過程,一般把這種操作封裝在類里面,就形成了我們的數(shù)據(jù)收集層。Php,就是對我們收集的數(shù)據(jù)進(jìn)行整理,規(guī)劃,同時(shí)解析模板進(jìn)行數(shù)據(jù)的顯示。Template,模板層,就是我們的HTML頁,里面不包含任何PHP代碼,只有模板標(biāo)簽的內(nèi)容,通過它來控制數(shù)據(jù)在頁面中有格式的顯示。我們這里三層中,每

3、一層都是鼓勵(lì)由一個(gè)人來開發(fā),然后通過PHPDoc之類的工具,把源代碼中的API生成文檔,由P層的人進(jìn)行調(diào)用。那么,在實(shí)際的項(xiàng)目開發(fā)中,它是怎么運(yùn)作的呢,我們又如何把這種設(shè)計(jì)模式引進(jìn)我們的項(xiàng)目中呢?我們下面將運(yùn)用一個(gè)實(shí)際的項(xiàng)目來講解DPT模式。閱讀一下內(nèi)容必須具備基本的PHP4的面向?qū)ο缶幊獭?shù)據(jù)庫抽象類、模板等知識。我們目前為了加速PHP的開發(fā),都使用PHP封裝了部分功能,比如數(shù)據(jù)庫操作抽象類,模板類等等,這些都是為了開發(fā)復(fù)雜應(yīng)用而應(yīng)運(yùn)而生的。目前比較主流的數(shù)據(jù)庫抽象類有phplib db、PEAR:DB、ADODB等等,模板處理類有phplib template、smartTemplate、

4、Smarty等等。本文中都是使用PHP Group推薦的產(chǎn)品,數(shù)據(jù)口抽象類使用PEAR:DB,模板處理類使用Smarty,如果對這兩個(gè)類庫不熟悉的讀者,請參考文章后面的鏈接。二、項(xiàng)目體系結(jié)構(gòu)下面我們來構(gòu)建我們基于DPT模式的PHP應(yīng)用。(以下部分內(nèi)容參考MVC模式、類封裝還是黑客代碼)文件目錄結(jié)構(gòu)(只涉及到關(guān)鍵的目錄)class   類庫,包含所有的數(shù)據(jù)收集層template  模板文件存放目錄include   常用庫,包括PEAR、Smarty等類庫,同時(shí)還有自己定義的基本函數(shù)config.inc.php  基本配置文件,包括數(shù)據(jù)

5、庫配置,其他基本信息配置security.inc.php 安全處理頁,主要多傳遞的變量進(jìn)行處理init.inc.phperror.php  錯(cuò)誤處理頁 class目錄中存放了我們數(shù)據(jù)收集層中的內(nèi)容,一般的建議是每個(gè)類文件只是針對一個(gè)表進(jìn)行操作,比如cmsMessage.class.php,那么這個(gè)類就是屬于功能CMS里面的,只負(fù)責(zé)操作Message這個(gè)表。所有的數(shù)據(jù)庫交互和操作都是封裝在類里的,在P層不允許出現(xiàn)任何直接操作數(shù)據(jù)庫的語句。template目錄中存放了我們的網(wǎng)頁模板,模板中都是使用Smarty標(biāo)簽進(jìn)行排列的,同時(shí),在模板中,都是建議使用JSCSS來控制頁面,模板中只有DI

6、V標(biāo)簽來簡單的排版,這樣,非常利于網(wǎng)站改版和更換皮膚。include目錄就是對常用文件的包含,比如PEAR:DB類、Smarty類庫文件等。config.inc.php就是基本的配置文件,包括數(shù)據(jù)庫、基本常量等等,security.inc.php是安全處理頁,我們這里主要是做一個(gè)變量的安全檢查,下面內(nèi)容我們將仔細(xì)介紹。init.inc.php是一個(gè)初始化操作的頁面,包括初始化數(shù)據(jù)庫鏈接,實(shí)例化模板處理類等等操作,error.php是錯(cuò)誤信息處理頁,所有的錯(cuò)誤信息通過URL編碼后轉(zhuǎn)到該頁。三、項(xiàng)目基本配置代碼關(guān)鍵頁代碼實(shí)例:/*  * config.inc.php  * 配置

7、文件 */ /* 數(shù)據(jù)庫配置 */define('DB_HOST', 'localhost');  /數(shù)據(jù)庫主機(jī)define('DB_USER', 'root');  /數(shù)據(jù)庫鏈接用戶define('DB_PASS', '');   /連接密碼define('DB_NAME', 'cms');   /默認(rèn)數(shù)據(jù)庫define('DB_PORT', '3306'

8、);  /數(shù)據(jù)庫端口define('DB_TYPE', 'mysql');  /數(shù)據(jù)庫類型define('DB_OPT', '1');   /是否長期鏈接/* 模板信息配置 */define('TPL_TEMPLATE_DIR', './template/');   /模板目錄define('TPL_COMPILE_DIR', './template/templates_c/'); /模板編譯目錄define

9、('TPL_CONFIGS_DIR', './template/configs/');  /模板配置文件目錄define('TPL_CACHE_DIR',  './template/cache/');  /模板緩存目錄define('TPL_LIFTTIME',  '1');    /緩存時(shí)間define('TPL_CACHEING',  'true');   /是否緩

10、存define('TPL_LEFT_DELIMITER', '');    /左邊界符define('TPL_RIGHT_DELIMITER', '');    /右邊界符/* 網(wǎng)站路徑配置 */define('ROOT_PATH', dirname(_FILE_);   /網(wǎng)站所在根目錄define('URL_PATH', dirname($_SERVERPHP_SELF);  /網(wǎng)站URL地址路徑defin

11、e('DB_PATH', ROOT_PATH.'/include/db');  /PEAR:DB目錄define('TPL_PATH', ROOT_PATH.'/include/smarty');  /Smarty目錄/* * security.inc.php  * 安全過濾文件 */* 過濾規(guī)則 */$arr_filtrate = array("'", '"', "");/* 過濾函數(shù) */function

12、 var_filtrate($var)  global $arr_filtrate;    foreach ($arr_filtrate as $value)             if (eregi($var, $value)             return true;      

13、;          return false;    /* 獲取不同版本下的GET和POST數(shù)組 */if (phpversion() < '4.1.0')     $get = &$HTTP_GET_VARS;    $post = &$HTTP_POST_VARS; else     $get = &$_GET;   

14、; $post = &$_POST;/* 檢查GET變量 */if (count($get)     foreach ($post as $get_var)         if (var_filtrate($get_var)             exit('Commit get parameter falsity');   &#

15、160;        /* 檢查POST變量 */if (count($post)     foreach ($post as $post_var)         if (var_filtrate($post_var)             exit('Commit post parameter falsity&#

16、39;);            其實(shí),以上過濾的方法也不是最好的,建議參考我的另兩篇防注入文章獲取更好的方法,鏈接參考附錄。/* * error.php * 錯(cuò)誤處理頁面 */if (!isset($getmsg)    exit('Not commit parameter');echo "Error Message: ". $getmsg;echo "<p><a href=

17、9;javascript:history.back()'>返回上一頁</a>"就是一些錯(cuò)誤處理的作用,一般出的GET方式傳遞過來的消息都是經(jīng)過urlencode()過的字符。/*  * init.inc.php * 初始化程序*/require_once(dirname(_FILE_).'config.inc.php');require_once(ROOT_PATH.'security.inc.php');require_once(DB_PATH.'DB.php');require_once

18、(TPL_PATH.'Smarty.class.php');/* 初始化數(shù)據(jù)庫鏈接 */$db = DB:connect("DB_TYPE:/DB_USERDB_PASS:DB_HOST/DB_NAME", DB_OPT);if (DB:isErro($db)     return $dg->getMessage();$tpl = &new Smarty();/* 初始化模板 */$tpl->templates_dir = TPL_TEMPLATE_DIR;$tpl->compile_dir = TPL

19、_COMPILE_DIR;$tpl->cache_dir  = TPL_CACHE_DIR;$tpl->configs  = TPL_CONFIGS_DIR;$tpl->lifetime  = TPL_LIFTTIME;$tpl->caching  = TPL_CACHEING;$tpl->left_delimiter = TPL_LEFT_DELIMITER;$tpl->right_delimiter = TPL_RIGHT_DELIMITER;基本文件描述完畢。代碼寫了不少,只是為了更好的理解這個(gè)模式。四、框架實(shí)際

20、開發(fā)說明:我們以下項(xiàng)目代碼都是以cms數(shù)據(jù)庫中topic表做例子,代碼只是為了演示框架結(jié)構(gòu),沒有對代碼進(jìn)行測試,不保證能夠正常運(yùn)行。topic的表結(jié)構(gòu):CREATE TABLE topic (  id int(11) NOT NULL auto_increment,  title varchar(255) NOT NULL default '',  addtime int(11) default NULL,  author varchar(50) default NULL,  type int(11) default NULL,

21、  option int(11) default NULL,  PRIMARY KEY  (id),  KEY id (id);(一)Data層:數(shù)據(jù)采集層Data層主要就是針對數(shù)據(jù)庫的所有操作都封裝起來,然后通過接口的形式提供給Php層進(jìn)行調(diào)用,同時(shí)在Data層里也封裝了一些原始的數(shù)據(jù)庫操作(類似于Java中的DAO)。一般Data層都是類的形式,保存在我們上面的 /class目錄下,一般的準(zhǔn)則是一個(gè)類文件操作一個(gè)數(shù)據(jù)表,就是說不管具體的業(yè)務(wù)邏輯如何,所有的數(shù)據(jù)表操作都是封裝在一個(gè)類文件里的。比如說我們有一個(gè)數(shù)據(jù)表叫做topic,那么我們對應(yīng)操作的類文

22、件就是:topic.class.php。其實(shí)這里是可以做擴(kuò)展的,比如說,我們的項(xiàng)目非常龐大,有很多內(nèi)容,比如包括有CMS、Blog、BBS等等,那么我們就必須給每一個(gè)欄目分配一個(gè)數(shù)據(jù)庫,那么針對當(dāng)前操作數(shù)據(jù)庫的話,就使用類中封裝的鏈接方法進(jìn)行鏈接,就可以拋棄我們上面init.inc.php中初始化的操作,而操作在類里面進(jìn)行的鏈接。假設(shè)我們目前操作的欄目是CMS系統(tǒng),數(shù)據(jù)庫名叫做cms,那么我們下面構(gòu)造一個(gè)操作cms數(shù)據(jù)庫里面的topic表的類來。/* * cms_topic.class.php * 文章處理類 */class cmsTopic var c

23、msDBName;  /數(shù)據(jù)庫名 var cTableName;  /當(dāng)前操作的表名 var cDsn;  /數(shù)據(jù)鏈接源 var cDebug;  /是否打開調(diào)試,1為是,0為否 var cDbPointer  /鏈接資源 var cfetchMode  /獲取數(shù)據(jù)庫資料的方式 var cEncode  /數(shù)據(jù)庫中數(shù)據(jù)保存的編碼格式,默認(rèn)是UTF-8 /* 構(gòu)造函數(shù) */ function cmsTopic()   /配置信息

24、從config.inc.php中設(shè)置  $this->cfetchMode = DB_FETCHMODE_DEFAULT;  $this->cTableName = "topic"  $this->cDsn = "mysql:/".   DB_USER.":".   DB_PASS."".   DB_HOST."/".   DB_NAME;  $this-&g

25、t;cEncode = "utf8"  /* 鏈接數(shù)據(jù)庫 */ function connectDatabase()   if (!is_object($cDbPointer)      $this->cDbPointer = DB:connect($this->cDsn);   if ($this->cEncode="utf8")     $this->cDbPointer->query(&qu

26、ot;set names 'utf8'");      $this->cDbPointer->setFetchMode($this->cfetchMode);   if (DB:isError($this->cDbPointer)     return false;      return $this->cDbPointer;    /* 關(guān)閉數(shù)據(jù)庫連接 */ funct

27、ion closeDatabase()   if (is_object($this->cDbPointer)    $this->cDbPointer->disconnect();    /*- 數(shù)據(jù)庫基本操作 -*/ /* 插入操作 */ function insert($arr)   if(!is_array($arr) | count($arr) = 0)   return false;     if("&quo

28、t; = $this->cTableName) return false;  $db = $this->connectDatabase();  $res = $db->autoExecute($this->cTableName,$arr,DB_AUTOQUERY_INSERT);    if(DB:isError($res)   return $res;  else   $insertId = ($db->getOne("select LAST_INSERT_ID(

29、);");   if($insertId>0)     return $insertId;   else     return true;        /* 更新操作 */ function update($id,$arr)   if("" != $id && !(is_array($arr)   return false; 

30、;   $db = $this->connectDatabase();  $res = $db->autoExecute($this->cTableName,$arr,DB_AUTOQUERY_UPDATE,"id = '$id'");  if(DB:isError($res)   return false;  else   return true;     /* 刪除操作 */ function delete($id)&

31、#160;  $db  = $this->connectDatabase();  $res = $db->query("DELETE FROM ".$this->cTableName." WHERE id = '$id'");  if(DB:isError($res)   return false;  else   return true;   上面的代碼一個(gè)很基本的針對一個(gè)表操作的類雛形已經(jīng)描述出來了,包括連接

32、數(shù)據(jù)庫,基本的數(shù)據(jù)庫原始操作都有了。你肯定會問,為什么沒有把select的操作封裝進(jìn)去?主要是因?yàn)閟elect是SQL里最復(fù)雜的操作,不可能寫那么通用的一個(gè)方法去操作它,所以好不如不寫,自由發(fā)揮。那么我們需要加上一些基本的功能呢?比如讀取內(nèi)容、新增加一篇文章等操作,那么我們還必須在類里面添加一些方法,比如我們增加提取一篇文章內(nèi)容、提取指定時(shí)間的文章、提取指定類別的文章、統(tǒng)計(jì)目前所有文章的總數(shù)等操作。/* * cms_topic.class.php * 文章類增強(qiáng) */class cmsTopic / .上面已經(jīng)描述的方法省略 /* 

33、* 函數(shù): getTopicContentById()  * 功能: 獲取指定ID的文章的內(nèi)容  * 參數(shù): $id  指定要獲取的ID  * $cols  要提取的字段值  * 返回: 成功返回?cái)?shù)據(jù)集數(shù)組,失敗返回錯(cuò)誤信息  */ function getTopicContentById($id, $cols="*")   $db = $this->connectDatabase($this->cDsn);  $sql = "SELECT $

34、cols FROM ". $this->cTableName ." WHERE id = '$id'"  $result = $db->getAll($sql);  if (DB:isError($result)    return $result->getMessage();  else    $db->disconnect();   return $result;    /*  * 函數(shù): g

35、etTopicBySpecifyTime()  * 功能: 獲取指定時(shí)間的文章的列表  * 參數(shù): $startTime 指定開始時(shí)間  * $endTime 結(jié)束時(shí)間  *  $cols  要提取的字段值  * 返回: 成功返回?cái)?shù)據(jù)集數(shù)組,失敗返回錯(cuò)誤信息  */ function getTopicBySpecifyTime($startTime=0, $endTime=0, $cols="*")   $db = $this->connectDatabase

36、($this->cDsn);  $start = ($startTime = 0) ? "" : "WHERE addtime > $startTime"  $end = ($endTime = 0) ? "" : "AND addtime < $startTime"  $sql = "SELECT $cols FROM ". $this->cTableName ." ".$start ." ".$en

37、d;  $result = $db->getAll($sql);  if (DB:isError($result)    return $result->getMessage();  else    $db->disconnect();   return $result;    /*  * 函數(shù): getTopicByType()  * 功能: 獲取指定類別的文章的列表  * 參數(shù): $type  指定的類型 

38、; *  $cols  要提取的字段值  * 返回: 成功返回?cái)?shù)據(jù)集數(shù)組,失敗返回錯(cuò)誤信息  */ function getTopicByType($type, $cols="*")   $db = $this->connectDatabase($this->cDsn);  $sql = "SELECT $cols FROM ". $this->cTableName ." WHERE type = '$type'"

39、0; $result = $db->getAll($sql);  if (DB:isError($result)    return $result->getMessage();  else    $db->disconnect();   return $result;     /*  * 函數(shù): getTopicSum()  * 功能: 獲取所有文章總數(shù),如果指定類別,則獲取指定類別總數(shù)  * 參數(shù): $type 

40、指定的類型  * 返回: 成功返回獲取的總數(shù),失敗返回錯(cuò)誤信息 */ function getTopicSum($type="")   $db = $this->connectDatabase($this->cDsn);  $typeStr = ($type = "") ? "" : " WHERE type = '$type'"  $sql = "SELECT count(id) FROM ".

41、$this->cTableName ." ".$typeStr;  $result = $db->getOne($sql);  if (DB:isError($result)    return $result->getMessage();  else    $db->disconnect();   return $result;   上面我們構(gòu)造了一些數(shù)據(jù)提取類,這應(yīng)該就是我們Data層的核心了。寫方法的時(shí)候要盡量考慮到擴(kuò)展性,比如對列的提

42、取,比如一個(gè)方法適合多種情況,比如排序等等,考慮的越多,以后維護(hù)起來就比較容易,當(dāng)然,我推薦的方法是一個(gè)方法盡量就做一件事情,如果一個(gè)函數(shù)要做多個(gè)事情,那么就寫成多個(gè)函數(shù),這樣便于代碼重用和維護(hù)性,我個(gè)人認(rèn)為一個(gè)方法最用不要超過100行。如果函數(shù)中有涉及到數(shù)據(jù)庫的操作,一定記得結(jié)尾的時(shí)候把數(shù)據(jù)關(guān)閉掉,不然很容易把服務(wù)器資源占用光。當(dāng)然,你也可以在PHP層去關(guān)閉連接。比如,你需要很多次調(diào)用同一個(gè)方法,那么這個(gè)方法如果反復(fù)的連接數(shù)據(jù)庫又關(guān)閉數(shù)據(jù)庫,也很浪費(fèi)資源,而且速度慢,這個(gè)時(shí)候就可以把關(guān)閉數(shù)據(jù)庫的操作在Php層進(jìn)行關(guān)閉,你可以先構(gòu)造好一個(gè)方法來進(jìn)行,比如我們上面的 closeDatabase(

43、) 方法。(二)Php層:數(shù)據(jù)調(diào)用層PHP層主要就是把從Data層收集的數(shù)據(jù)再這一層進(jìn)行調(diào)用。因?yàn)槲覀兓镜脑瓌t就是把所有跟數(shù)據(jù)庫的操作都封裝在Data層里,在其他層都不涉及到任何的直接對數(shù)據(jù)庫的操作,這樣能夠進(jìn)行良好的封裝,這樣有點(diǎn)類似于 JSP和Javabean,Javabean的類負(fù)責(zé)和數(shù)據(jù)庫交互,JSP負(fù)責(zé)調(diào)用Javabean來輸出數(shù)據(jù)。我們這里的PHP層就相當(dāng)于JSP層,前面的Data層就相當(dāng)于Javabean層,這樣玻璃他們之間的耦合度,能夠方便程序日后的維護(hù)。我們這里的PHP層主要就是復(fù)雜從數(shù)據(jù)庫種提取數(shù)據(jù),完成一些簡單的邏輯,然后把數(shù)據(jù)輸出到Template(模板層)?,F(xiàn)在我們

44、利用示例代碼來看看PHP層是如何調(diào)用Data層的數(shù)據(jù)的。/* * topic_list.php * 文章列表程序 */* 包含基本文件 */require_once("init.inc.php");require_once("class/cms_topic.class.php");/實(shí)例化Data層對象$topic = new cmsTopic();/獲取文章類型變量$topicType = intval(get("type");/從Data層中把數(shù)據(jù)提取過來$topicList = getTopicBy

45、Type($topicType);/給模板變量賦值后輸出頁$tpl->assign("topic", $topicList);$tpl->assign("topic.html");代碼是不是很簡單?就是把數(shù)據(jù)獲取過來,然后解析到模板層中去處理,所以這樣如果以后出現(xiàn)問題改起來比較容易,比如是數(shù)據(jù)獲取的問題,那么直接改上面的類文件就行,如果是模板顯示的問題,那么直接修改模板層中的對應(yīng)的模板頁就可以,非常便于維護(hù)。(三)Template層:模板層這個(gè)模板層就是我們常說的網(wǎng)頁了,不過這里就是包含了一些Smarty的模板變量和HTML混和,模板頁處理的

46、時(shí)候就對頁面中的模板變量進(jìn)行替換,最后我們看到的結(jié)果就是模板頁和PHP層中的程序輸出混和的結(jié)果。一般模板頁設(shè)計(jì)的時(shí)候,最好遵循Web標(biāo)準(zhǔn),就是說盡量在頁面中不使用表格等html標(biāo)簽來控制頁面,而是使用div層來存放數(shù)據(jù),使用css樣式表來控制頁面布局,這樣對包括JavaScript腳本的編寫,以后頁面的改版等等非常有好處。而且如果要還模板也很簡單,只需要把css文件替換就可以達(dá)到效果。當(dāng)然,如果對web標(biāo)準(zhǔn)不了解,那么建議去閱讀一下網(wǎng)站重構(gòu)這本書。我們下面就簡單的描述一下Template(模板層)的代碼是如何的。* 加載頭部文件 *include file="header.html&

47、quot;* 模板主體 *<div> * 左邊導(dǎo)航條 *</div><div> <h3>文章列表</h3> section name=topicList loop=$topic  標(biāo)題:<a href="">$topictopicList.title|escape:"html"|truncate:30:".":true</a> |  時(shí)間:$topictopicList.addtime|date_for

48、mat:"%Y年%m月%d日" |  作者:$topictopicList.author|escape:"html"<br /> sectionelse  暫時(shí)沒有任何文章 /section</div>* 加載底部文件 *include file="foot.html"模板頁中大致可能有一些JavaScript程序,或者有樣式文件,一般使用樣式文件來控制頁面的布局和顯示效果。我們這里沒有詳細(xì)的描述,在實(shí)際項(xiàng)目中可以由網(wǎng)頁制作人員去負(fù)責(zé)。五、使用DPT模式的項(xiàng)目規(guī)劃一般在所

49、有的軟件項(xiàng)目或者是網(wǎng)站項(xiàng)目中,要保證一個(gè)項(xiàng)目能夠順利完整的完成,那么便需要技術(shù)主管或者架構(gòu)師良好的設(shè)計(jì)和管理。一般所有項(xiàng)目中人是最難控制的因素,你可以把項(xiàng)目指定的非常完善,架構(gòu)可以選擇的非常合理,但是你不能控制人的因素,不能保證項(xiàng)目的中的某個(gè)成員可能在任何時(shí)候離開項(xiàng)目。當(dāng)在PHP項(xiàng)目中,如果一個(gè)項(xiàng)目角色忽然的離去,可能導(dǎo)致項(xiàng)目要停頓,要重新找人來接替,影響了項(xiàng)目的進(jìn)度,那么如何有效的控制和解決這些問題。在一個(gè)使用DPT設(shè)計(jì)模式的項(xiàng)目中,項(xiàng)目中個(gè)個(gè)角色分別有網(wǎng)頁設(shè)計(jì)師、網(wǎng)頁制作人員、客戶端腳本JavaScript程序員、服務(wù)器端PHP程序員。他們的分工都是什么呢?網(wǎng)頁設(shè)計(jì)師負(fù)責(zé)設(shè)計(jì)網(wǎng)頁的界面,生

50、成效果圖,然后由網(wǎng)頁制作人員去做成網(wǎng)頁,當(dāng)然,如果是遵循Web標(biāo)準(zhǔn)的項(xiàng)目的話,那么網(wǎng)頁制作人員主要的任務(wù)就是負(fù)責(zé)頁面布局樣式的編寫??蛻舳顺绦騿T主要是負(fù)責(zé)客戶端腳本的編寫,比如針對頁面中需要使用的JavaScript進(jìn)行編寫,PHP程序員主要是負(fù)責(zé)我們上面Data & PHP & Template 三層的代碼編寫,當(dāng)然,如果項(xiàng)目足夠龐大,完全可以拆分出來,有PHP程序員負(fù)責(zé)Data層,有PHP程序員負(fù)責(zé)Php和Template層,分工清晰,Php層程序員只是需要調(diào)用Data層程序員已經(jīng)寫好的類庫進(jìn)行調(diào)用,不用關(guān)心類是如何實(shí)現(xiàn)的。這樣一個(gè)項(xiàng)目架構(gòu)下來,可以按照任務(wù)需要來安排某個(gè)模

51、塊的人的數(shù)量,最大限度的把項(xiàng)目規(guī)劃好。當(dāng)然,項(xiàng)目中一些必要的因素是要考慮的,比如,如何讓網(wǎng)頁制作人員、客戶端腳本程序員和PHP程序員良好的合作,那么就是分離他們的責(zé)任,比如,模板頁必須由PHP程序員來編寫,然后提交給JavaScript程序員制作客戶端腳本,最后再由網(wǎng)頁制作人員通過CSS來控制布局,那么Php程序員在模板頁中就必須使用div等標(biāo)簽來定義一個(gè)塊的數(shù)據(jù),如果任何一塊出了問題,那么對應(yīng)找相應(yīng)責(zé)任人,就能夠很好的避免彼此推卸責(zé)任,或者權(quán)責(zé)不分的情況,這樣有利于管理,也有利于每個(gè)開發(fā)成員之間的良好合作。為了防止項(xiàng)目失控,或者不會因?yàn)轫?xiàng)目成員的離開而影響項(xiàng)目的進(jìn)度和管理,必須有相應(yīng)的方法和

52、規(guī)則。我們主要針對PHP程序員來進(jìn)行描述,部分方法同樣適用于網(wǎng)頁制作人員和客戶端腳本程序員。(1)編碼規(guī)范項(xiàng)目開發(fā)中為了便于維護(hù)和以后其他人接手代碼,必須統(tǒng)一編碼規(guī)范,包括對目錄、文件名、類、函數(shù)、變量、注釋等等都必須遵循標(biāo)準(zhǔn),而且為了代碼的維護(hù),必須要求PHP程序員編寫注釋。目前基本遵循的是Fredrik Kristiansen寫的PHP 編碼規(guī)范,或者是PEAR中代碼的規(guī)范。如果代碼為了做成接口,或者需要做成參考的文檔方便以后維護(hù)代碼,使用phpDoc等工具,那么為了能夠使用PEAR包中的phpDoc能夠正常識別,所以一般建議遵循PEAR包的規(guī)范,主要是DPT模式中Data層中類的的編碼必

53、須規(guī)范。PEAR中pear.php中基類的部分代碼:class PEAR    /* 屬性的描述 */    / properties    /*     * Whether to enable internal debug messages.     *     * var     bool     * a

54、ccess  private     */    var $_debug = false;        /其他屬性省略.    /     /* 對方法的描述 */    / constructor    /*     * Constructor.  Registers this object in     * $_PEAR_destru

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論