用 PHP 開發(fā)健壯的代碼(一):高屋建瓴的介紹
發(fā)表時間:2023-08-12 來源:明輝站整理相關軟件相關文章人氣:
[摘要]用 PHP 開發(fā)健壯的代碼 系列文章是關于解決大中型應用程序中的實際問題的。這一系列文章主要側重于 PHP 4 中可用的新功能,重點介紹了大量使開發(fā)工作更容易的技巧和竅門。在這一系列文章中,您將發(fā)現(xiàn)...
用 PHP 開發(fā)健壯的代碼 系列文章是關于解決大中型應用程序中的實際問題的。這一系列文章主要側重于 PHP 4 中可用的新功能,重點介紹了大量使開發(fā)工作更容易的技巧和竅門。在這一系列文章中,您將發(fā)現(xiàn)許多要學習的示例和技術,還附帶了大量樣本代碼。在這第一篇文章中,PHP 高手 Amol Hatwar 從更高的角度介紹了如何為中到大型 Web 應用程序設計和編寫無錯誤、可維護的代碼。
如果您是一名構建 Web 應用程序的開發(fā)者并且需要速度、功能和平臺獨立性(platform-independence),那么 PHP 將適合您。而且 PHP 是免費的,易于學習和部署。這些是使 PHP 如此受歡迎的最大優(yōu)點。但這些優(yōu)點也可以變成缺點。由于 PHP 易于使用,所以開發(fā)者在本應規(guī)劃和設計的時候,他們經(jīng)常先把代碼硬塞到編輯器中。而且,在 PHP 中,解決問題的方法不止一種,比較容易犯那種慘痛的錯誤,這種錯誤過后難以訂正。
在這一系列文章中,您將學會如何避免許多錯誤。如果您一步不落地堅持到底,您會發(fā)現(xiàn)自己嘗試一兩次就能編寫無錯誤的代碼了,對此不要感到奇怪。我還會指出 PHP 4 中可用的新功能,它們使開發(fā)工作更容易。我要介紹的大多數(shù)示例都是用來處理諸如腳本配置和安裝、文件處理以及數(shù)據(jù)庫使用之類的實際問題。即使您對這一切都不熟悉,您也會發(fā)現(xiàn)理解起來很容易。不過,我假設您對 PHP 有初步的了解。如果您需要重新溫習,您會發(fā)現(xiàn)本文結尾處所列出的參考資料會對您有所幫助。(請參閱參考資料。)
奠定健壯的基礎
用 PHP 編寫代碼與用類似 C 的語言編寫代碼非常相似。由于它們句法上類似,所以還會導致類似的代碼維護問題。當必須開發(fā)大型應用程序時,您可能要編寫大量代碼。隨著時間的流逝,這些代碼可能變得難以管理,錯誤很快就會乘虛而入。無論您從哪里聽到這種說法,都不要相信 — 至少不能全信。但是,更重要的事實是如果您發(fā)現(xiàn)自己維護代碼過于頻繁,那么首先您的應用程序的設計可能是很糟糕的。
正確地設計代碼
您最初做出的選擇會影響您以后編寫代碼時的自由度。這使得正確的設計成為一個重要的先決條件。雖然當您解決一個微不足道的問題時設計會成為一個額外的儀式,但是您至少必須知道就是應該這樣做的。許多人把設計和規(guī)劃看作額外的開銷。但是以糟糕的設計開始,或者根本就沒有設計,結果總是會造成草率的代碼。請記住,再巧妙的編碼也不能彌補糟糕的設計。雖然如何設計應用程序超出了這個系列文章的范疇,但我還是會提示一些設計 Web 應用程序時應該牢記的問題。
分割和征服
通過一個個較小的松散耦合的部件來設計和編寫大型應用程序總是更可取的。這樣,每個部件都是可維護的。例如,一個內容管理系統(tǒng)(Content Management System,CMS)可能分布在許多諸如用戶認證、顯示、內容解析和查看統(tǒng)計信息等較小的模塊上。而且,如果您的模塊足夠通用的話,您可以在您開發(fā)的其它應用程序中重用代碼。程序員經(jīng)常這么做,但他們仍然抱怨。至于編碼的技巧就是讓每個模塊具有它絕對需要的功能并且到此為止。賦予一個模塊的功能要不多不少,恰到好處。
絕對不要在頁面中考慮
如果您對用 PHP 將您的 HTML 頁面變得更動態(tài)些感興趣,這部分將適合您。當您想在每個頁面上顯示日期和時間以使其看上去是最新的時候,通常是這個習慣開始的時候。每個 HTML 頁面都變成一個只有有限幾行的小 PHP 腳本,日期函數(shù)隱藏在某個地方。如果這是您想要的,您必須認可這是使該作業(yè)實現(xiàn)的最簡單的方式。但是,想象一下您必須做些什么變動才能改變頁面上呈現(xiàn)的日期格式。您將不得不更改每個頁面內的代碼。
顯然,有更好的方式來達到這個目的。我最喜歡的方式是使用配置文件并在配置文件中定義一個常量,這個常量保留 date() 函數(shù)的格式字符串。然后,您就可以在需要的地方使用 date() 函數(shù)了。每個頁面仍以腳本結束,但是您要徹底地把那些您必須對單行代碼作更改的地方降到最少。
圖 1. 避免硬編碼
如上圖所示,您在所有頁面上都能看到日期格式的更改。這里的想法就是要避免復制代碼以及硬編碼。在編寫大型應用程序時,請牢記這一點。當您避免了復制代碼時,調試和維護就變得更加容易了。
減少客戶機端要求
Web 頁面和應用程序的類型已經(jīng)向多方向發(fā)展了。首先是圖像和圖像映射,然后是實現(xiàn)很酷的動畫的 Java applet 和客戶機端腳本,F(xiàn)在是 Flash。有影響是好事情,但是您必須記住 Web 背后的整體思想是使任何需要信息的人都能隨時訪問這些信息。如果您使用并非所有瀏覽器和平臺都支持的技術,就會拒絕人們訪問您的信息。您永遠不知道不能訪問您 Web 站點的人是否本來可以成為您的下一個客戶!
您的應用程序設計應該盡可能地將網(wǎng)絡流量降到最低。我們經(jīng)?吹皆S多網(wǎng)站訪問量過多并且只給瀏覽器一類僅能使其運行的 cookie。篡改大量 cookie 不僅消耗帶寬,而且還使得許多方面難以管理。根據(jù)經(jīng)驗,如果您的應用程序發(fā)送超過 40 KB 的數(shù)據(jù)或者如果您的頁面需要多于 5 秒的時間來裝入,那就該從頭設計應用程序了。各處的小調整不會持續(xù)太久。如果您到處看看,就會發(fā)現(xiàn)最受歡迎的、訪問人數(shù)最多的站點都是非常簡單的。
您還應該考慮下一波移動設備以及它們訪問您的應用程序所用的連接。最好的做法就是,您的應用程序必須根據(jù)請求內容的客戶機對內容進行調整。Leon Atkinson 在他的 Core PHPProgramming 一書的第 720 頁中說到,“我們可以設法將 HTML 文檔的大小控制得較小,并且我們可以設法避免諸如嵌套表(nested table)這樣的復雜的 HTML,但是我們不能對每個人的 28.8 調制解調器都進行升級!
把代碼、內容和顯示分開
HTML 是顯示內容的標記語言,PHP 是嵌入 HTML 的腳本語言。這確實使簡單的任務變得容易 — 例如,以日期為例。不過,當您要實現(xiàn)復雜的要求時,將 PHP 嵌入 HTML 使代碼的簡單性盡失。盡可能地把代碼、內容和顯示分開,這很好?紤]一下您正在閱讀的這個文檔。這個文檔開始被創(chuàng)建為一個 XML 文件。HTML 和 PDF 版本是用樣式表自動生成的。代碼(向您顯示該頁面的應用程序)、內容(XML 文檔)和顯示(樣式表(style sheet))是不同的。
正象將核心功能封裝在模塊中以及避免代碼復制很重要一樣,用單獨的內容源代碼以及按照要求的方式顯示內容也很重要。您根據(jù)客戶機和連接速度定制頁面的靈活性也增加了。同時使程序員、設計師和作者彼此獨立工作 — 如果您正在處理一個大型項目,這是一件好事。
不要害怕拋棄設計
無論別人告訴您什么,實踐才是學習應用程序設計的最佳方式。如果您剛剛起步,可能會犯許多錯誤 — 這就是學習方法。糟糕的設計應該被拋棄。這就是您必須保持代碼、內容和顯示松散耦合的原因 — 拋棄糟糕的設計成為減輕痛苦的手段。當您丟棄陳舊的代碼,以更好的代碼取而代之的時候,您可以保留內容和顯示。
現(xiàn)在,回到我所承諾的問題上,使您的代碼健壯起來。您必須一直記住您的代碼將為其他人的內容和顯示提供力量。如果您的代碼不能勝任的話,其他部門再多驚人的努力也不能彌補這個缺陷。
編寫健壯的代碼
假定您的代碼要求不變,您將不會明顯地發(fā)現(xiàn)更改代碼的需要。除了偶爾需要最優(yōu)化和改進之外,您的代碼應該像加了潤滑油的機器一樣運行。
聽上去很困難?事實并非如此。坦白地說,編寫健壯的代碼并不需要天才。您只需要在拿不準的時候問自己一些適當?shù)膯栴},這樣就不會偏離正軌:
它安全嗎?
它簡單且易于理解嗎?
它是平臺獨立的嗎?
它足夠快嗎?
保護您的代碼
任何使大量用戶滿意的系統(tǒng)都必須是安全的。盡管 PHP 本身不易受到黑帽(black-hat)黑客的攻擊,但是您不要太肯定。在版本 4.2.2 之前的 PHP 4 有嚴重的安全性缺陷。要一直確保在有適當加密的網(wǎng)絡上存儲或傳送敏感數(shù)據(jù)。這對于處理業(yè)務、存儲信息(如信用卡號碼)以及傳輸機密數(shù)據(jù)的應用程序來說更重要。
現(xiàn)在,很難信任用戶提交的數(shù)據(jù)。要確保對數(shù)據(jù)進行了驗證并確保數(shù)據(jù)在使用前是清白的。請牢記,將您的 Web 應用程序放到因特網(wǎng)上就是向巨大的網(wǎng)絡公布了您的系統(tǒng)、軟件、數(shù)據(jù)以及業(yè)務。
確保您的代碼一直安全地運行。
保持代碼簡單
您的代碼應該是易于理解、可讀性好且文檔良好的。為了減少您熟悉自己或其他人的代碼所需的時間,請在工程內一直使用公共命名和編碼約定。請投入時間以確保在需要維護代碼時這些方面會有所回報。
您最好在編程時為代碼建立文檔。能為您解析所有的腳本并創(chuàng)建看起來整潔的 HTML 格式的文檔的工具并不存在。如果您改變了代碼的行為,就要相應地改變文檔。如果代碼的文檔并沒有實際記錄什么東西,那么擁有這樣的文檔是沒用的。
確保您的代碼是備有文檔的、簡單的并且易于理解的。從長遠來看這樣會有所幫助。
使代碼是平臺獨立的
您必須解決的另一個問題是平臺獨立性。當然,為 Windows 上的 PHP 編寫的腳本將對任何其它平臺上的 PHP 起作用:PHP 就是這樣設計的。不過,您仍然需要小心比較小的不一致。例如,換行字符在 Windows 和 UNIX 中就以不同的方式表示。
您在訪問資源(如位于 PHP 外部的數(shù)據(jù)庫)時還必須使用抽取。比方說您的應用程序用 MySQL 作為數(shù)據(jù)庫服務器來削減成本。如果您決定以后擁有一個功能更豐富的數(shù)據(jù)庫,您必須更改應用程序中的代碼。對代碼進行重大更改總是一個苦差事而且是一個易出錯的過程。請使用抽取來隔離對易于更改的部分的改變。您不必重新編寫整個應用程序。
確保您編寫的是平臺獨立的代碼。這使您的應用程序具有更好的適應性和可伸縮性。
為速度構建
最后一個值得處理的因素是速度。當您的腳本從數(shù)據(jù)庫中拖拖拉拉地選擇大約 300 個條目并顯示一個頁面時,沒有人愿意一直等下去。將 20 個結果放在 15 個不同的頁面(這些頁面在用戶的瀏覽器上快速移動和裝入)上通常是一個較好的主意。用戶把更快的響應時間理解為速度。另一個易犯的錯誤是每次用戶訪問頁面時都動態(tài)創(chuàng)建頁面。這的確能確保您的站點總是最新,但是當用戶數(shù)量增加時,PHP 就不能容許這樣做了。您應該高速緩存那些使用頻繁的頁面。高速緩存使您的應用程序速度更快并且減少了服務器上的負載。
確保您的代碼快速運行。沒人喜歡等待。
總結
在這個系列的開篇文章中,您了解了編寫健壯的代碼要實際做些什么事。如果您認真學習的話,用 PHP 開發(fā)大型應用程序一點兒都不難。事實上,許多用 PHP 編寫的應用程序已經(jīng)輕松開發(fā)出來了。同時,意識到您容易掉入陷阱中是很重要的。只要您進行了規(guī)劃、把事情分解成許多小一些的任務并且正確實現(xiàn)它們 — 幾乎沒有別的什么會阻礙您了。
在下一篇文章中,您將學會如何高效率地使用變量和函數(shù)。我將額外向您展示如何用 PHP 中的變量和函數(shù)變一些戲法。我們在這篇文章中規(guī)劃了我們要討論的主要內容。在下一篇文章之后,我們將逐個討論這些內容 — 可能甚至會跳躍著講述。到時再見。