文章目錄
緣起
我使用PHP語言已經有很多年了。在過去的幾年中,雖然並不曾用PHP開發什麼大項目,但一直都在用PHP做一些小東東,並關注PHP的發展。為什麼PHP語言如此讓我關注呢?原因有兩個:
- PHP是一個開源語言,其語言與庫都是開源的。而且其有成熟的開源社區,這對於技術開發人員而言是極大的支撐;
- PHP是一個完全面向Web開發的語言。PHP對於Web開發的專註,使得這個語言在Web開發上具有其它語言所不能比擬的一些優勢。比如PHP既能編寫羽量級的Web網站,也能支撐超負載大規模的Web應用。PHP在Web上有許多清晰而簡潔的解決方案,這是許多通用語言所不能比的。比如我所喜歡的另一個開源語言Python,其也能用於開發Web應用。但Python的目標顯然不限於Web開發,因此在Web開發方面Python的生產力並不比PHP強。
雖然上述都是一些個人觀點,但從實際應用上看,在Web應用中,PHP顯然是最流行的語言。許多知名網站都建築在PHP上。
前幾年我所經曆的Web開發,仍集中與.Net平台上。所以對於PHP,僅僅作為個人珍愛,並沒有多少實際項目應用。但從今年開始,隨著軟體開源趨勢的發展,在Web端採用PHP的項目也多了起來。我的幾個朋友都在進行PHP項目的開發,這在幾年前是難於見到的。我是很高興看到這一變化的。開源的發展勢必深刻影響軟體業的發展,這樣更多更豐富的軟體資源將被生產出來,我們將面對不再是“Wintel”世界,這很好......
因此我將這些年的一些PHP技術筆記整理出來,作為一個界石放在自我Web開發之路上。在該石之前是點滴零碎的PHP愛好者,在此石之後我將更深入地探索PHP技術,在PHP世界中深耕細作。
PHP基礎文法印象
PHP是一個應用型的語言。它從多個語言中擷取靈感,包含許多語言特質。因此對於熟悉 C、C++、Java等語言的人來說,PHP語言很好學。而且其採用了一種最直接的嵌入方式——。這種嵌入方式最大程度地保留其與HTML和XHTML的接觸度,從工程角度上看是極其經濟的。正因如此,當年PHP出現後,MS即可將這種方式引入IIS中,開發出ASP語言。
當然直接嵌入的方式也存在許多問題,其最主要的是無法做大。小打小鬧的HomePage可以,但多人團隊操作的Web應用程式則很困難。PHP從C/C++中借鑒了 include 方式,基於include、require、require_once等關鍵詞來進行多文檔關聯。而在PHP4/5中,更強調前後台之間的分離,採用MVC設計模式來構建Web程式。經過多年的發展,PHP語言已經可以勝任大型Web程式的開發。
我認為PHP語言的核心,應該是:
- 庫和架構: 引用在C/C++中的經驗,庫學習是PHP中的核心。PHP中有兩類庫——核心庫(Core)和拓展庫(Extend)。核心庫中對於字串操作、數組操作、日期操作與Regex操作應該由其用心,這些庫很多是基於Web UI的,而Web程式的輸入輸出是很關鍵的技術,其涉及許多安全與穩定方面的問題,也涉及使用者體驗等問題。而拓展庫是方便開發的。PHP具有豐富的拓展庫資源,不論是PECL拓展還是PEAR拓展,或是sf.net上的眾多PHP程式模組,都是可以挖掘借鑒的財富。而一些成熟的庫或程式,已經成為一種穩定的架構,如Smarty和Drupal。利用這些架構,可以極大提升項目開發速度與品質;閱讀這些架構,可以極大提升自我PHP方面的功力。在庫與架構上花費時間與精力是最值得的。
- OOP開發與設計模式:雖然直到PHP5才支援OOP設計,但在PHP4中可以採用"回呼函數(callback function)"等來類比類的動力學模型。而現在OOP開發已經成為基礎技術,不論是多人的大型項目程式,還是單人的小程式,都應當採用OOP的方式進行。PHP最簡單的回呼函數就是一個函數變數,範例如下。
PHP技術快速一覽
我將這幾年積累的PHP技術進行一些分類整理,其主要有:
- 字串庫:在Java、.Net中都有類似的字串處理函數庫,需要注意的是Unicode字元處理庫 mbstring 拓展庫;
- 數組處理:與C/C++所不同的是,PHP數組處理技術非常的複雜,其與頁面效率密切相關。比如要用shuffle()或array_rand()來隨機抽取元素;盡量用foreach而不是用for來遍曆數組。更重要的是,PHP數組承擔了設定物件與儲存物件的作用,在許多庫或架構的使用前,都要設定一個配置數組來進行自訂配置;
- 日期與時間:需要注意其適用場所,並不一定要詳細其在毫秒層級上的資料,其效率很可能與伺服器和網路環境有關。因此對於PHP程式測試,應該採用用戶端的Javascript來進行計時,其與PHP伺服器端的計時相對照會更有用;
- Regex與伺服器變數:在PHP中,Regex與伺服器變數是用來防止攻擊,對HTTP訪問進行過濾與校正的最基本工具。我的做法是在開發前,開發一個基於Regex與伺服器變數的myFilter類,該類用於過濾資訊,實現最基本的防護作用;
- 資料庫:要深入學習資料抽象層技術,對於 metabase/PEAR:DB/PDO和ADODB等抽象層庫有充分的瞭解。這樣資料庫程式才能有良好地移植能力。我選用ADODB,主要原因是其與.Net架構有相似性,並且能支援Python。
- 會話管理:在Web2環境下,Cookie的管理比Session更重要。對於PHP項目中的核心業務步驟,不採用Ajax方式,用Session進行管理;對於其它非核心的業務(主要是查詢),可以採用Cookie方式,將部分Javascript程式下發到Cookie中,非常有利於提升客戶體驗。
- 國際化與本地化:PHP項目中應堅持用Utf-8編碼(頁面與資料),而且在編寫程式UI時,應採用 gettext 擴充庫進行多語言支援。我的做法是基於Drupal架構進行PHP開發,充分利用Drupal提供的t函數方式進行國際化與本地化。
- 緩衝與加密:PHP有很好的緩衝技術與加密技術,相關的庫有ob_庫、MD5、SHA1、Cracklib拓展庫與mycrypt拓展庫。利用緩衝與加密技術,可以有效提升系統效能,特別在進行核心資料處理方面。而對於使用者體驗方面,我的側重點在於採用Ajax技術與Xml相結合方式;
- 其它技術:PHP的Shell技術可以實現部分系統業務的自動化;而利用Curl庫可以製作一些自動爬蟲程式,用來進行單元測試與資料採礦工作;PHP對於影像處理有很好的技術方案,GD2、Ming與ImageMagick都是很好的選擇。