|
由于 php 正在成熟,因此是快速即編即用的腳本編制人員與了解 UML 的面向?qū)ο蟮拈_發(fā)人員“思想達成一致”的時候了。
很少有編程語言能夠像 php 這樣迅速地得到普及。現(xiàn)在廣泛宣傳的那個關(guān)于自己動手做 (DIY) 的腳本編制語言改變 IT 業(yè)的故事表明,成功不一定總是來自于系統(tǒng)計劃和市場研究。但是現(xiàn)在的實際問題是這種成功如何能夠為龐大的 IT 業(yè)所接受。Oracle 以及其他幾個大的參與者正在關(guān)注 php 錚錚事實表明,這種語言已經(jīng)成熟。
直到現(xiàn)在,成功也只是剛剛“出現(xiàn)”。數(shù)量不斷增長的愛好者已經(jīng)聚集在 php 周圍,就象聚集在一個天才神童身邊一樣。但是既然這個孩子正在長出胡子,并開始以平等的地位與成人交談,那么早期的擁護者會適應(yīng)這種變化嗎?
php 與大部分主要的開放源代碼項目一樣,是正在成為主流技術(shù)的過程中的一種基本現(xiàn)象。php 會使那些使它獲得名譽的人們失望嗎?它會達到龐大的 IT 業(yè)的期望嗎?
兩種編程文化的故事
php 的成功吸引了不同背景人士的注意。早期的 Rasmus 的擁護者(如果您能諒解那些在開放源代碼圈內(nèi)不常出現(xiàn)的略以救世者自居的語氣)習(xí)慣于快速的即編即用的腳本編制方法,他們現(xiàn)在必須對付那些了解 UML、面向?qū)ο?(OO) 編程的開發(fā)人員,這些開發(fā)人員決心使 php 與其他現(xiàn)代開發(fā)工具并駕齊驅(qū)。雙方都很了解 Web 開發(fā),都擁有強大的文化。忽略任何一方都是不明智的。
早期的 php 類型了解 Web 開發(fā)的哪些方面,它擅長做什么,不擅長做什么?它了解很多關(guān)于設(shè)計的問題。它的風(fēng)格有時可能會有問題,但可以看出它擁有 HTML 和 CSS 功能,不必說更為流行的多信息互聯(lián)網(wǎng)應(yīng)用程序 (RIA) 技術(shù)了。它總是那么年輕,卻經(jīng)常出現(xiàn)在 php 論壇中。術(shù)語“面向?qū)ο蟆睂τ谒赡芫哂胸撁娴暮x。它的代碼很扼要,注重表現(xiàn)而不注重可維護性。
由于采用類型松散的變量和為其 HTML 代碼填充 <?php?> 語句,因此 UML 類型將更缺乏吸引力。它將要考慮應(yīng)用程序體系結(jié)構(gòu)、類級代碼重用、團隊合作以及源代碼管理。它知道,即使復(fù)雜度適中的網(wǎng)站首先也是一個應(yīng)用程序,而設(shè)計不良的應(yīng)用程序會導(dǎo)致工期延誤、惹惱客戶甚至丟掉工作。
乍一看來,后者似乎更適應(yīng)于需求越來越多的環(huán)境,在這種環(huán)境中,Web 開發(fā)將會越來越多地受到營銷策略和經(jīng)濟因素的驅(qū)動。但是我們是否應(yīng)該把前者看作瀕臨滅絕的物種?或許不應(yīng)該這樣。如果我們承認 Web 是與臺式機系統(tǒng)差別很大的一種媒介 ― 更不要說大型機了(還有人記得 3270 嗎?),在大型 機環(huán)境中產(chǎn)生了占統(tǒng)治地位的開發(fā)方法 ― 則我們可能會得出結(jié)論,畢竟可以從這種成功卻相對雜亂的方法中學(xué)到很好并且有效的東西。
讓我們來回顧實際的問題,以便在其可能發(fā)生之前加以克服,并回顧一些實際的工作方法。
彌補文化差距
現(xiàn)在 php5 即將把面向?qū)ο蠹夹g(shù)帶入到 php 世界中。Zend 引擎修改 (ZE2) 正在將對象引入到該語言的核心。不僅新的語言構(gòu)造鼓勵對象編程風(fēng)格,而且語言的實施也正在適應(yīng)其他的面向?qū)ο蟓h(huán)境。例如,不再以缺省方式將對象進行來回的復(fù)制,而是通過引用來進行處理。引入了新的關(guān)鍵字(如 final 或 static),它們只與對象概念相關(guān),是對 Java 風(fēng)格的保留;其他特性(如委托)鼓勵使用對象設(shè)計模式。(期待在幾個月的時間后能夠聽到大家談?wù)摗霸械?php4”。) 這種深刻的變化來自于向當前占優(yōu)勢的編程模型進行無情的革命性轉(zhuǎn)移。無論您喜不喜歡,對象方法都將會流行,因為它已證明自己在提供復(fù)雜應(yīng)用程序方面最有效,無論它們是不是 Web 應(yīng)用程序。這使得我們別無選擇,只能尋找富于想象力的方法來協(xié)調(diào)兩種文化,以便具有設(shè)計思想的人與了解體系結(jié)構(gòu)的人能夠取長補短。
為此,必須開發(fā)(或從其他平臺中變換出)各種方法,以便在將其包含在清晰的界限內(nèi)的同時獲得語言的多功能性。這樣,編程創(chuàng)造力的“孤島”就可以存在于強健的體系結(jié)構(gòu)中。
一個明顯的事實是,盡管 php CMS 或應(yīng)用程序框架的數(shù)量呈爆炸性增長,卻沒有關(guān)于它們的一致意見。經(jīng)常出現(xiàn)的報怨是,無論您的項目是什么,現(xiàn)有系統(tǒng)都不能完成任務(wù)。人們大都開始于對若干系統(tǒng)的評估,而最后經(jīng)常是從頭開發(fā)自己的框架。這是為什么?
在臺式機系統(tǒng)中,似乎已經(jīng)由操作系統(tǒng)徹底解決了 GUI 設(shè)計問題,與此相反,Web 是個原始視覺設(shè)計舉足輕重的平臺。Web 站點承載商業(yè)公司的形像和個性,可能會日益影響其收入。視覺創(chuàng)造力與品牌共同發(fā)揮作用,因此必須促進它們的發(fā)展。
同時,必須能夠?qū)㈧`活的邏輯編入到應(yīng)用程序中,以便盡可能改善用戶體驗,應(yīng)牢記,用戶在 Web 上要比在臺式機系統(tǒng)中可能表現(xiàn)的更“菜”。
當設(shè)計人員不斷對程序員所設(shè)計的系統(tǒng)感到失望時,這是個問題,而當開發(fā)人員不得不將應(yīng)用代碼強行加入到不完備的門戶框架中時,這同樣是個問題。最常見的結(jié)局就是無法令人滿意的折中 ― 有些呆板的外觀、為了將應(yīng)用的復(fù)雜性限制在某個可管理級別而犧牲了很多可用性。(這種現(xiàn)象并不只限于 php 應(yīng)用程序。)
為了徹底克服這些限制,設(shè)計人員和面向?qū)ο箝_發(fā)人員必須找到一種不阻礙對方工作的協(xié)作方法。最好的方法可能是從了解對方團隊如何工作開始。
從技巧到產(chǎn)業(yè)
此刻先不要考慮協(xié)作問題,讓我們觀察各自的實際操作。讓我們按照 php 的歷史順序開始,首先訪問一個“增強 html”使用者的商店。
進行交易的工具非常類似于“純 html”使用者的工具:一些 html 編輯器,具有各種級別舒適特性和項目管理特性,并在某種程度上與 php、ASP、JavaScript 以及較次要工具相集成。
讓我們花點時間仔細觀察一下代碼。我們首先會注意到,使用這些不同種類的工具生成的網(wǎng)站非常漂亮。我們在這里不僅指技術(shù),也指天賦。由于擺脫了抽象編程因素的限制,Web 設(shè)計人員通過擺弄積極、微妙的情感效果(類似于機敏的裝飾人員在真實商店中所營造的效果)營造了令您網(wǎng)站的客戶感到安適的視覺環(huán)境。
當我們從經(jīng)過訓(xùn)練的面向?qū)ο缶幊陶叩慕嵌葋砜催@些代碼時,事情卻突然變得很糟。代碼看上去就象它本身一樣:它是一次性的、用完即忘的工作,沒有為將來的發(fā)展或者為簡易的維護作出任何準備。經(jīng)常這樣,的確如此。
那么,這有什么不好嗎?它以后是否會成為一個難題,導(dǎo)致放棄部分或整個網(wǎng)站并從頭開始重建呢?或許不是。畢竟,真實商店的裝修經(jīng)常定期拆除并重建。因此,就這些櫥窗式的網(wǎng)站而言,牛仔風(fēng)格的 php 編程已經(jīng)夠用了。這種語言富含各種有助于實現(xiàn)旨在吸引訪問者注意的視覺效果的技巧。這里顯然與對象方法無關(guān)。
一旦需要某些應(yīng)用邏輯時,這種觀點就發(fā)生顯著的變化。您是否需要若干表單來收集有關(guān)您網(wǎng)站的常客的少量的營銷信息?如果您希望這種信息能夠很中肯,則最好添加校驗代碼。如果這樣做,您應(yīng)該確保可以過濾惡意腳本或 SQL 指令侵入式攻擊。順便說一下,既然您正在閱讀 OTN 文章,因此您一定熟悉數(shù)據(jù)庫 (DB) 問題。您將要收集的這些信息將會存放在某些數(shù)據(jù)庫表中,而您的 php 代碼中的 SELECT 語句將反映這種數(shù)據(jù)庫結(jié)構(gòu)。從現(xiàn)在開始,這個網(wǎng)站已經(jīng)固定在您的業(yè)務(wù)基礎(chǔ)架構(gòu)中 ― 它正在成為成熟的應(yīng)用程序。
我們暫時不要管其所有的硬編碼鏈接、危險的類型轉(zhuǎn)換以及安全漏洞,接著訪問最新的 php 面向?qū)ο?a href=/pingce/yingyong/ target=_blank class=infotextkey>應(yīng)用程序裝配線。對于我們那些具有藝術(shù)家風(fēng)范的 Web 設(shè)計人員而言,這種地方可能并不熟悉,甚至可能并不友好。在這里不太看重技巧。Web 開發(fā)已經(jīng)產(chǎn)業(yè)化了。要想為這里所接受,您必須熟悉類、繼承、數(shù)據(jù)抽象以及大量的代碼封裝工具。
團隊協(xié)作需要規(guī)則。必須遵循編程慣例;必須將源文件提交版本管理和源代碼管理。文件根據(jù)嚴格的模塊化層次進行組織。摒棄了那些有危險的編碼技巧 ― 尤其是那些耍小聰明的技巧。代碼不僅必須易讀,而且必須有良好的注釋。
這樣可能令人厭煩,但卻很有效。現(xiàn)在我們正在創(chuàng)建 Web 應(yīng)用程序:內(nèi)聯(lián)網(wǎng)、商業(yè) Web 站點、電子市場、各種應(yīng)用程序,其中具有缺陷的設(shè)計都可能會導(dǎo)致停業(yè)。簡言之,我們正在克服復(fù)雜性。
php 面向?qū)ο笱b配線的管理者并沒有選擇 php,因為他們熱愛這種語言。他們之所以這樣做,是因為它不但能像那些專有的其他語言一樣有效地完成工作,而且還是免費的,并且沒有任何附加條件。
我們要走向何處?
那么我們將如何利用由那些經(jīng)過 C++ 和 Java 培訓(xùn)的人們所提供的行業(yè)級方法,以完成對早期使用者所使用的多功能語言的專業(yè)技術(shù)的潛在補充?
php5 將會動搖很多習(xí)慣,因此這個問題可能為時尚早。有些人將被迫采用一定程度的面向?qū)ο蠓椒ǎ硪恍┤俗罱K會了解面向?qū)ο蟮乃袃?nèi)容并成為它的信仰者。某些小環(huán)境可能會象過去那樣良好運行并繼續(xù)興盛發(fā)展。
讓我們來實踐一下
現(xiàn)在讓我們深入到基礎(chǔ)的技術(shù)級別,了解如何養(yǎng)成簡單的習(xí)慣,以及尋找簡單而有效的解決方案將會如何幫助我們準備好應(yīng)對即將來臨的變化。大量非常簡單的慣例有助于促進編程,并使應(yīng)用程序準備好進行擴展。
命名慣例(C++ 編程人員的習(xí)性)是最容易的方式。如果您已經(jīng)大量使用了代碼庫(例如 PEAR),則將其慣例作為自己的慣例可能是個好主意;否則應(yīng)制定您自己的內(nèi)部規(guī)則。簡化的匈牙利批注(根據(jù)其匈牙利發(fā)明者 Charles Symonyi 而命名)可在松散類型所允許的范圍內(nèi)廣泛應(yīng)用。您還可以使用下劃線作為類成員的前綴。另一個有用的習(xí)慣是,向那些并不用于從類外部進行調(diào)用的方法(屬于一個類的函數(shù))附加一個特殊的前綴(例如 impl_)。
無論您采用什么命名慣例,都要盡可能使您的代碼明確清楚。這樣,經(jīng)過訓(xùn)練的人員就可能在滿屏的 php 中發(fā)現(xiàn)編程錯誤,只因為它看上去就有問題,就象肖像上的一個污點。
命名慣例的另一個重要方面是避免名稱沖突,使得在大范圍中重用代碼成為可能。經(jīng)驗告訴我們,程序員在命名編程對象方面并不總是非常富有想像力。很有可能,存在很多的 Page 類,而且也不是沒有可能當您要重用兩個 Page 類時卻發(fā)現(xiàn),它們只是名稱相同而用途卻迥異。真不夠走運的。從長遠看來,重命名將會帶來維護問題。您最好一開始就避免這個問題。生成 GUID 將會矯枉過正、難看(例如 _16B280C5_EE70_11D1_9066_00C04FD9189D_Page!)并且有悖于 php 的精神。
一種簡單并可以防止沖突的方法是,通過將類的幾個不同方面關(guān)聯(lián)到其名稱中(例如 GalleryPage),確保內(nèi)部類的唯一性;而后,為了消除與您控制范圍之外的類發(fā)生沖突的各種可能,您可以按 Java 的方式將您擁有的域名的保留版本作為它的前綴 (com_mydomain_GalleryPage)。
要養(yǎng)成的另一個習(xí)慣不需要您花費什么,并且當某個應(yīng)用程序范圍的意外變化不可避免時,它可以節(jié)省您的工作,這就是將最常用的基本語句封裝在一個單獨的渠道中。例如,除了調(diào)試代碼,在整個應(yīng)用程序中只應(yīng)該有一個“響應(yīng)”語句,它應(yīng)該在某個函數(shù)(或單獨的類方法)中。如果某個新環(huán)境中需要對輸出進行預(yù)處理或重定向,則您知道應(yīng)該將所需的幾行代碼寫在哪里,而不必面對那種搜索和編輯大量文件的令人沮喪的情況。
錯誤處理不必像 C++ 中那樣嚴格 ― 在 C++ 中,一個懸空指針 (dangling pointer) 或者緩沖區(qū)溢出可能極具破壞性。當沒有危及數(shù)據(jù)完整性時,試著大方地放下架子告訴訪問者,盡管某些功能不太完善,但她可以再試試。一個經(jīng)常被忽視的好幫手是標準的 set_error_handler() 函數(shù)。這是另一個 ― 這次是基本事件 ― 封裝到一個集中位置(其中所有代碼都專門用于處理這些基本事件)的例子。如果您希望保留所有發(fā)生錯誤的事件日志,以便找出重復(fù)發(fā)生的問題,則應(yīng)該在這里完成這項工作。
在我們結(jié)束低級編程討論之前,還有另外一個救命招術(shù)。在 php5 中,缺省情況下,分配或傳遞對象引用(引用是對象的句柄,而不是對象本身或?qū)ο蟮母北荆V灰覀冞€需要使用 php4,就必須認真注意對象的傳遞方式。某些微妙之處可能使您心神不寧。例如,以下語句導(dǎo)致 $obj2 成為 $obj1 的副本;這并不奇怪。
$obj2=$obj1;
函數(shù)將使用副本并返回副本,除非另有指定 ― 我們只得接受這種情況。以下示例導(dǎo)致很多了難以跟蹤的錯誤:
class ObjectKeeper {
var $_obj; // Whatever object is
function & get_object() {
return $this->_obj;
}
}
//引用可以良好地返回。現(xiàn)在陷阱出現(xiàn)了:
$keeper = new ObjectKeeper();
$obj1 = $keeper->get_object();
$obj1->modify();
$obj2 = $keeper->get_object(); // Ask new reference to same object
if ($obj2->is_modified()) {
echo 'OK'; // 這將永遠不會打印
}
正確的語句應(yīng)該是:
$obj1=&$keeper->get_object(); // 注意,是“=&”而非“=”
如果沒有 =&,則返回的引用所指向的對象的副本被分配給 $obj1,而無論您對您認為正確的引用進行什么操作,也不會影響原始對象的狀態(tài)。換言之,您的更新將會丟失。
在協(xié)調(diào) Web 設(shè)計人員與程序員的文化方面,模板可能會大有幫助。它們通常包括布局中所配備的一切(主要是 HTML 代碼),而在生成頁面時,模板引擎填入所有可變的內(nèi)容。大部分模板引擎帶有高速緩存機制,確保相關(guān)的耗費資源的處理只發(fā)生在數(shù)據(jù)源更新要求進行這些處理的時候。
接下來的步驟
論壇:Oracle 上的 php
php 漫游者指南
開放源代碼開發(fā)人員中心
Oracle + php 疑難解答指南
php 腳本編制:隨心所欲的代碼逐漸流行
Oracle + php 使用入門
在 Linux 上安裝 Oracle、php 和 Apache
模板引擎允許在相當大的程度上將布局和圖形分在一端,將商務(wù)邏輯分在另一端。最流行的模板引擎可能是 Smarty,它也恰好被集成在很多開放源代碼的 CMS 和框架項目中。
最后,必須注意當邏輯超出基本的搜索取代式的替換時,模板引擎傾向于提供編程方言。將來的方法很可能依靠 XSLT 技術(shù),而 php5 中的擴展 XML 支持將會因此而改變很多。
最后卻是相當重要的一個實踐方面:從眾所周知的庫中重用一流的代碼。我們的研究將只限于 PEAR,因為它現(xiàn)在是標準 php 發(fā)行版本中的一部分。
PEAR 可能目前更接近于真正標準的 php 軟件組件。嚴格選擇提供者以及嚴格的質(zhì)量標準確保了組件與商業(yè)級組件一樣優(yōu)秀。版本控制慣例為您提供精確控制,以確定組件的哪個版本適合于您的應(yīng)用程序。PEAR 提供從表單處理到數(shù)據(jù)庫抽象層 (PEAR::DB) 等一系列豐富的功能,并包括 Web 服務(wù)或 WebDAV 支持等高級特性。
不用說,通過熟悉 PEAR 以及類似的 php 代碼庫,您可以節(jié)省很多天緊張的研發(fā)工作。
php5 呼之欲出
php 已經(jīng)使自己成為最大的開放源代碼成功的故事之一,與 Linux 和 Apache 齊頭并立。盡管尚有不理想之處,但它已經(jīng)在 IT 界牢牢站穩(wěn)了腳跟,并且其龐大的基層用戶群仍然很喜歡它。
php5 可能會促進負擔(dān)沉重的 Web 應(yīng)用程序的開發(fā),與數(shù)據(jù)庫進行交互作用的業(yè)務(wù)邏輯層越來越多地接受 php 代碼。同時,靈活的編程方法將會越來越多地使用 XML 技術(shù),使 Web 設(shè)計人員更容易與開發(fā)人員和軟件設(shè)計人員進行無摩擦的協(xié)作。
我們期待看到新一代非常具有吸引力并且非常好用的基于 php 的 Web 應(yīng)用程序。
php技術(shù):PHP 已經(jīng)成熟,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。