PHP專案規劃

來源:互聯網
上載者:User
譯者序:專案規劃是業界比較重視的一個專題,但似乎專門講PHP專案規劃的文章不多。在PHP Freaks上看到這篇文章,雖然寫得並不專業,但是在相對中文資源相對缺泛和滯後的PHP領域,還是有一點參考價值的。在翻譯時覺得原文的語言群組織不太 符合中文的閱讀習慣,於是就對原文的邏輯進行了一定修改。資源共用,歡迎轉載,望註明出處。

原文:http://www.phpfreaks.com/tutorials.php?cmd=view&tutorial_id=135

本Blog的原文存檔:http://blog.donews.com/phpor/articles/460809.aspx

作者序:我所見過的大部分的PHP程式都存在架構和組織混亂的問題,這就說明它們缺乏規劃。很多PHP程式員並沒有對項目進行足夠的考慮就一頭栽進了 編碼工作之中。這是我在3-4個月前寫的一篇文章,之後我學到了更多,特別是關於OOP技術的東西。

規劃?

無論我們是在開發大型、中型還是小型的項目,規劃是始終是最重要的事情。當我們的水平達到某個層次的時候,我們就可以編寫一些程式而無需看著教程或書 籍。也許我們懂得用PHP串連資料庫,輸出運算結果,建立類等等。然而,很多人的水平達到這個階段的時候就很容易只顧編碼而完全忽略了規劃。

儘管即興編程聽上去不錯,但如果我們要一個工具幫我們實現流線型的編碼作業、簡便的升級過程以及輕鬆的編碼工作,規劃就是最好的選擇。如果我們已經規 劃好了資料庫結構,如果我們對自己的代碼已經有了大概的輪廓,如果我們非常清楚自己寫的程式是做什麼用的,那麼,編碼工作只不過小菜一碟。多數的書籍或教 程中都沒有詳細地講解規划過程,因為通常作者已經做好了這個工作。但如果我們要自己來編一個程式,那麼對程式的規劃就顯得尤為重要了。當我們要為程式添加 新的功能或特性,以及要開發新版本的時候,就會發現程式的規劃和良好的代碼結構會是開發過程中最重要的一個環節。

這篇文章會以一個留言本程式作為樣本,但並不會教你如何編寫PHP代碼,而是教你如何更好的組織和規劃你的代碼。它會探討程式特性規劃、類的規劃、資料庫結構、模板、訊息提取以及一些基礎的編碼技術。

目錄

首先,請看看這篇文章大概包括了哪方面的內容

規劃程式特性

你的程式是做什麼用的?

程式各種特性之間的關係如何?

用什麼代碼來處理這些特性間的關係?

資料庫

用哪種資料庫?

怎麼使用資料庫?

什麼東西存在資料庫內?什麼東西存在設定檔內?

規劃代碼結構

你的程式要用哪些類?

這些類是做什麼用的?

如何組織它們?

程式是如何調用這些類的?

什麼東西寫進類裡,什麼東西寫進過程代碼裡?

以上的雖然不是這篇文章的全部內容,但是文章會對這些問題進行探討。

程式特性規劃

規劃程式特性最基本的要求是我們必須知道自己的程式是做什麼用的。首先,要對程式基本的特性有一個大概的輪廓,就如這個留言本一樣,我們可以列出了以下東西:

1)顯示留言功能;2)發表留言功能;3)管理功能;4)模板功能。

是如何寫出這些特性的?很簡單,我參考了其它的留言本,看看它們有什麼特性,並大概的做了一個分類。然後再想想有什麼類型的特性是它們沒有而我們又想添加上去的。但這樣做只是粗略地勾畫出一些基本的特性而已

現在,我們需要對這些特性進行補充和擴充,列出我們認為程式必須具備的詳細特性。下面我們隨便列舉一些:

顯示留言功能

預設每頁顯示10條留言,但允許使用者自行定製

使用java script實現留言的展開和收縮

支援BB代碼

發表留言功能

在每一頁加上發表留言的連結

必須填寫的資訊:呢稱、留言

可選填的的資訊:電子郵件、網站、IM帳號、地理位置

隱藏表單域:IP地址(用於防止垃圾資訊)

管理功能

編輯留言

刪除留言

屏蔽IP地址

詞語過濾器

基本設定:網站名稱,留言本名稱,網站URL,資料庫主機、名稱、使用者、密碼

留言回複

簡單的模板編輯及添加功能

管理員身分識別驗證

模板功能

從資料庫或文字檔提取變數值並替換

如果你不想自己寫模板,可以使用像Smarty和patTemplate這種現成的模板引擎

當然,寫出了以上列表並不代表我們規劃好了這個程式,但是你有沒有發現把基本特性列出來以後,編碼工作變得簡單了?當我們開始寫代碼的時候,就很清楚地知道要往哪裡去,以及各種功能之間的聯絡了。

編碼規劃

現在要開始規劃代碼了。我們要讓程式基於資料庫運行嗎?如果是的話,用什麼資料庫?又或者是我們是不是想讓程式基於文本資料庫?如果是的話,如何實 現?還有就是,我們的代碼是基於哪種結構的?對於大型的程式開發,我的建議只有三個字:Object Oriented Programming。

開發大型PHP程式最佳的代碼結構就是使用OOP。比方說,我們有一個論壇程式是用OOP開發的。現在程式裡有一個類叫做view,在view裡有一 個方法叫viewThreads(),可以通過接受參數來輸出文章內容。如果現在有一個叫viewforum.php的頁面用於每次顯示一個特定的文章, 那麼我們就可以調用$view->viewThreads()來輸出結果了。如果還有一個搜尋功能,也要輸出文章的內容,那麼我們只需調用 viewThreads()這個方法即可。如果沒有使用OOP,當我們要改變輸出文章的代碼的時候,就必須修改每一個顯示文章的檔案,但用了OOP,我們 只需修改類代碼就行。但使用OOP的真正意途是使代碼更容易組織和擴充。

因為,我們決定用OOP來編程了,至少也要用在這個留言本上。現在的問題就是:我們將會編寫哪些類?這些類是用於完成什麼工作的?如果我們要使用資料 庫的話,那麼至少需要一個類來處理和資料庫的資料交換。還有的就是,我們需要一個留言處理類來處理輸出和添加留言,一個管理類來完成管理工作,一個模板類 來處理模板。在一些大型項目中,我推薦使用現成的模板類如Smarty和patTemplate等,這樣既可以免除很多煩瑣的工作又可以在程式裡面實現一 些強大的功能,最重要的一點就是,你現在在編寫的是留言本,而不是模板引擎,所以使用現成的就可以了。

當我們決定了編寫哪些類時,最好就把這些類以及它的方法列出來。下面就是一個例子:

code:
class Entry {
function Entry() {
//這個方法要定義和初始化全域變數以及要包括資料庫處理的類
//注意這個方法名要和類的名字一樣,這樣當類被調用是,這個方法也會被執行

}

function view($num, $start) {
//這個方法會從資料庫的中ID為$start的留言開始讀出$num條留言數
}

function post($name, $email, $website, $aim, $yim, $msn, $icq, $title, $post) {
//這個方法將把傳輸過來的資料寫入資料庫中
}
}
?>

顯然,要完成這些類還要進行很多的編碼工作,雖然具體代碼還沒填上,但是我們已經有了代碼的大概結構了,這樣就使後面的編碼工作輕鬆多了。

這個例子並沒有完成全部的規劃工作,還要對其它的類做同樣的工作。但是,這個例子卻告訴了你怎麼做。無論是大型的CMS、論壇,還是小型的留言本,這種做法都能使你的代碼寫得更好。

使編碼工作更簡單的方法

模板

在開始編程的時候,千萬不可以忽略了模板和模板機制。所有的編碼工作都必須緊扣模版,因此不要把它放在最後。我推薦使用Smarty模版引擎,當然 patTemplate也不錯。但無論你選哪個或者你自己來寫,都要把這個工作放在最前面來完成,因為模板是和終端使用者關係最密切的一部份。我推薦各位最 好建立一個類來負責管理模版,這個類並不是去做模版該做的事,只不過是管理它而已。假如我們用Smarty模版,我們可以這樣:

code:
class Template {
function Template() {
require_once("Smarty.php");
$smarty = new Smarty();
}

function showTpl($tpl) {
$smarty->display($tpl);
}
}
?>

要完善模版管理,我們還要做更多的工作。但上面的這個類足以讓你簡單地在第一頁引用Smarty的調用和輸出代碼,而無需一次又一次地編寫了。

抽象處理

什麼是抽象處理?我們常聽到的是“資料庫抽象”,一種可以使你無需修改代碼就可以訪問眾多資料庫的技術。但是,所謂的抽象處理還有可以是輕鬆編碼的代 詞。有這樣一種情況:我們需要所有的頁面的某部分(如頁首、頁尾、變數引用等)內容相同,這時我們可以一次又一次地重寫這部份的內容,也可以建立一個包括 這些重複內容的頁面然後在每一頁中引用它。雖然輸出頁面重複內容時引用公用檔案的這種方法在Smarty面前已黯然失色,但是,還是有它另類的用法,特別 是在一些大型程式中。

訊息抽象就是抽象應用的一個例子。在這個留言本中,我們需要輸出如“留言提交成功”、“請輸入呢稱”等訊息,就可以建立一個訊息類來處理它:

code:
class msg {
function msg($num) {
$start = '

';
$end = '

';
$message = $start;
switch($num) {
case 1:
$message .= '帳號名錯誤';
break;
case 2:
$message .= '錯碼錯誤';
break;
}
$message .= $end;
echo $message;
}
}
?>

如果做了登陸頁面,我們就可以這樣訪問訊息類:

code:
include 'msg.php';
if($pass != "arr") {
$msg = new msg(2);
} elseif($user != 1user1) {
$msg = new msg(1);
}
?>

顯然,對於身分識別驗證,上面這個並不是一個好的例子,但我們可以通過它看到訊息抽象的好處。我之所以把這個例子引入文章內,是為了使編程更方便。使用類 似的訊息抽象機制在需要輸出反饋資訊的地方,你可以很輕鬆的通過修改一個檔案完成相關的工作。

不僅如此,如果我們需要添加新的訊息,只需加上一個新的case即可,然後在相關的地方調用它,而無需再添加echo語句。如果使用模版的話,我們就 不可以像上面那樣簡單地把訊息放在類裡,而是當類被調用時,使用事先建立的子模版來顯示訊息,這種方法在Smarty中只不過是三行代碼而已。

現在你應該清楚上面所說的抽象處理了。

還有一個經常說重點不要忘記,就是在你的代碼中添加適當的縮排。類中的第一個方法,程式中的第一個自訂函數、迴圈語句和運算式等。除此之外,注釋也 不能忽略。我們肯定很清楚自己剛寫完的代碼是做什麼的,但是幾月之後,可能要對代碼進行升級,這時,我們就會發現有注釋的代碼確實易讀很多。

規劃!

看完這篇文章,你應該會知道我一直所強調的就是規劃,它使編碼變得更簡單。如果對項目做了規劃工作,那麼一切進展都會變得順利。比如說,如果你特定的 功能建立了類,那麼調試這些工能將會是一個簡單的工作;如果你使用了模版引擎,那麼你的代碼將會顯得更簡潔、更易於維護和升級。

一但確定了你工作的方法,就把這些方法用到每一段代碼上。每次我對項目進行規劃以及使用了適合的工作方法之後,我都會發現編碼品質有了飛躍。也許你不 願意把時間放在規划上,因為它會佔用你的時間,但當你要添加新功能、升級程式、修改代碼或改變介面的時候,你就會那是一件很痛苦的事情。

看完本文,如果你對規劃產生興趣的話,可以嘗試像上面給出的例子一樣列出程式各方面的內容,然後編寫一些簡單的程式,並且試一下基於OOP編程以及使 用Smarty的hidden/shown功能。如果你還不懂OOP編程的話,不用急,可以先看一些教程。

本文教會了你一些規劃項目的基本方法,顯然,對項目的規劃工作並不只有這些。如果你還想瞭解資料庫的設計,可看看本站的LAMP教程,除此之外,本站 還有上面提到的訊息抽象的教程。無論如何,規劃確實對你的工作有很大的協助,希望本文對你有協助。
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.