php教程:php設計模式之前言

來源:互聯網
上載者:User
當你在不斷的試圖從你的應用程式中發現新的特徵時,你是否發現你提出的解決方案和一些以前你已經實現的東西是如此的類似呢?如果你是一個程式員(即使你才 開始很短的時間),你都可能回答“是”。這看起來就是你使用了一些以前的代碼來解決軟體開發過程中新發現的問題了。你可能已經認識到:你的解決方案是基本 原理,是一個不僅僅是你而且是所有專業開發人員都能廣泛重複應用的方法。

事實上,許多程式問題都不斷的反覆的遇到,而且許多用來解決這些問題的基本方法(或者說是設計模式)都已經浮現出來。設計模式就是一個教你如何利用真實可靠的設計來組織你的代碼的模板。

設計模式曆史

“設計模式”這個術語最初被設計用於建築學領域。Christopher Alexander 在他1977的著作“A Pattern Language :Towns/Building/Construction”裡面描述了一些常見的建築學設計問題,並解釋了如何用這些已有的,著名的模式集合來開始全新 的有效設計。Alexander的觀點被很好的轉化到軟體開發上來,並且長期的合意的用原有的組件來構造新的解決方案。

所有的設計模式都有一些常用的特性:一個標識(a name),一個問題陳述(a problem statement)和一個解決方案(a solution)。

一個設計模式的標識是重要的,因為它會讓其他的程式員不用進行太深入的學習就能立刻理解你的代碼的目的(至少通過這個標識程式員會很熟悉這個模式)。

問題描述是用來說明這個模式的應用的領域。?

解決方案描述了這個模型的執行。一個好的設計模式的論述應該覆蓋使用這個模型的優點和缺點。

一個模式是解決特定問題的有效方法。一個設計模式不是一個庫(能在你的項目中直接包含和使用的程式碼程式庫)而是一個用來組織你的代碼的模板。事實上,一個程式碼程式庫和一個設計模式在應用上是有很多不同的。

比如,你從店鋪裡面買的一件襯衫是一個程式碼程式庫,它的顏色,樣式和大小都由設計師和廠商決定,但它滿足了你的需求。

然而,如果店裡面沒有什麼衣服適合你,那你就能自己建立自己的襯衫(設計它的形狀,選擇布料,然後裁縫在一起)。但是如果你不是一個裁縫,你可能會發現自 己很容易的去找一個合適的模式然後按著這個模式去設計自己的襯衫。使用一個模型,你可以在更少的時間內得到一個熟練設計的襯衫。

回到討論軟體上來,一個資料提取層或者一個CMS(content management system)就是一個庫——它是先前設計好而且已經編碼好了的,如果它能準確的滿足你的需要那它就是一個好的選擇。但如果你正在讀這本書,可能你會發現 庫存的(原有的)解決方案並不是總是對你有效。至今你知道什麼是你所要的,而且你能夠實現它,你僅僅需要一個模型來引導你。

最後一個想法:就象一個裁縫模型,一個設計本身而言是沒有什麼用處的。畢竟,你不可能穿一個服裝模型——它僅僅是由很薄的紙拼湊起來的。類似的,一個軟體設計模型也僅僅只是一個引導。它必鬚根據程式設計語言和你的應用程式的特點和要求而特別的設計。

本書的目標

本書的目的不是為了全面的介紹各種類別的軟體設計模式,也不是為了發展一個新的設計模式或者術語,而是為了突出介紹一些已有的著名的設計模式。這本書的 獨特之處在於介紹了一些我認為對開發動態WEB應用程式很有協助的設計模式,而且用PHP語言顯示了如何?這些設計模式。

面對對象編程OOP

這本書一個優點就是所有的觀點都是基於OOP這種很自然的設計模式,並且用OOP來實現。

如果你不熟悉OOP,有很多相關的資源(書籍,網站,雜誌,上課等等)來協助你更好的瞭解它。大多數OOP資料都讚美它的好處——代碼重用,代碼健壯,代 碼封裝,多態和可擴充性,當然所有的這些也是非常重要和有用的。然而,我認為OOP最主要的優點是它如何激勵你親手將問題分解成易處理的模組。清晰的設計 和實現,分解成小的模組,這樣你的代碼能夠得到更加徹底的測試而且也更加容易理解和維護。

讀者技能要求

這本書假定你已經能夠流暢的使用PHP了。特別地,這本書假設你已經瞭解了PHP和PHP文法的運作知識而且懂得用OOP執行PHP代碼的基本原理。這本書不是一本PHP編程的介紹書,也不是為了介紹PHP的OOP編程的。

由於不是所有的OOP開發人員都使用相同的術語,當有新的術語被引入時,我都將在本文中或者工具條中定義。

PHP4和PHP5

當我寫這本書的時候,PHP5已經發行有一段時間了,但是還沒有被公眾團體廣泛的採用。在我自己的工作上,我已經開始把新的應用程式開發工作遷移到 PHP5.0.3的環境中,而且到目前為止我很高興的發現PHP5對PHP4的代碼具有很好的向後相容性,同時它的面對物件模型是PHP5最有意義的新特 征之一。

有很多很好的文章和指導手冊來處理不同PHP版本之間的物件模型之間的細微差別。但簡單來說,PHP5提供了:

對象柄(將在下面解釋,更詳細的請見第二章:物件模型的價值)?

更好的構造器(統一名字,不允許改變)?

析構器?

可見度(方法和屬性的public公開,protected受保護,private私人)?

異常處理(可以選擇新的文法try{}catch{}來觸發錯誤)?

靜態類?

映像(動態檢查類,方法,屬性)?

類型隱藏?

PHP5也提供了一些更加模糊的特徵:

新的魔術方法?

__get()和__set()允許你來控制變數存取

__call()讓你能動態截取被call對象的所有屬性。

__sleep()和__wakeup()能讓你重載序列化的方法

__toString()讓你能控制如何用一個字串來描述這個對象自身。

自動載入Autoloading(當類第一次被對象化時候,允許使用者自動載入該類)?

Final(不允許該方法或者一個類被其子類重載)?

對象柄

PHP5最好的特性就是採用控制代碼來定義類,類似於一個檔案或者資料庫控制代碼。在PHP函數中使用對象不再是含蓄的複製這個對象,而是提供一個操作控制代碼。

為了更加清楚的看出其間的不同,我們考慮下面兩個例子:

// PHP4 class
class ExampleP1 {
var $foo;
function setFoo($foo) {
$this->foo = $foo`;
}
function getFoo() {
return $this->foo;
}
}
function changeExample($param) {
$param->setFoo(‘blah’);
return $param->getFoo();
}
$obj = new ExampleP1;
$obj->setFoo(‘bar’);
echo $obj->getFoo(); // bar
echo ChangeExample($obj); //blah
echo $obj->getFoo(); // bar

在PHP4中,函數changeExample()中的變數$param是$obj的一個複製,所以,這個函數沒有改變原來對象中的$foo的值,這樣$obj->getFoo()最終輸出的是’bar’。

在PHP5中,由於$obj在函數中只是一個對象操作柄,同樣的changeExample()函數確確實實的影響了原來的對象。換句話說,使用操作柄,就不再需要去複製了而$param就是$obj執行個體。

// PHP5 class
class ExampleP2 {
protected $foo;
function setFoo($foo) {
$this->foo = $foo;
}
function getFoo() {
return $this->foo;
}
}
$obj = new ExampleP2;
$obj->setFoo(‘bar’);
echo $obj->getFoo(); // bar
echo ChangeExample($obj); //blah
echo $obj->getFoo(); // IMPORTANT, produces blah

當你在其他的對象或者這個對象內建的建構函式(__construct)裡面使用$this這個變數時,這個問題會變的更加的複雜。

結果是在PHP4中,你幾乎總需要:

建立一個引用對象,就象這樣$obj=?& new class;

在函數中調用引用對象,比如function func(?&$obj_param){}

通過引用函數來捕捉對象,比如function? &some_func(){} $return_obj=&some_funct()

事實上,現在有些情況下你也需要複製原始對象。在我的PHP4代碼裡面,我總是把任何無引用的對象任務比如為一個明顯的對象複製注釋的很清楚。從長 期來說,這樣的一個簡短的注釋能夠極大的減輕任何一個維護你代碼的人的頭痛(譯者註:這樣的代碼可維護性很強)。引用傳值,對象柄和對象複製的相關知識將 在第二章“對象模式的價值”裡面詳細講解。

儘管我個人很偏向於使用PHP5開發,但我感覺到PHP4將繼續被我們使用相當長的一段時間,而且現有的公開發布的項目也將繼續支援PHP4。所以,本 書對兩種版本的PHP提供相同的支援。儘可能的提供了PHP4,PHP5兩個版本的執行個體代碼。在每一章裡面,每一個代碼塊(在不同的PHP版本中有所改動 的)中都提供有相應的注釋來暗示其改變,比如//php4和//php5。

參考書目和其他資源

這裡有很多相關的參考書來協助你更好的學習設計模式。設計模式的“聖經”(譯者譯:最好的書)是Erich Gamma, Richard Helm, Ralph Johnson和John Vlissides(他的開創性作品經常被提及為“Gang of Four”簡寫為”GOF”,就是代表他們四個人)撰寫的《設計模式:可重用的面對對象軟體開發原理》。

關於“設計模式”,下一個最有用的關於PHP WEB應用程式設計模式方面的書就是Martin Fowler出版的Patterns of Enterprise Application Architecture (譯者譯:公司專屬應用程式程式體繫結構模型)。與GOF的書包含了所有一般的設計模式相比,Fowler的這本書詳細的介紹了許多專門用於開發web應用程式的 設計模式。

另外在很多網站上也提供了有關設計模式方面的豐富資源,一個特別典型的網站就是傳輸速率蘭模型庫(http://cz.com/por/)。

另外一個關於PHP設計模式的網站是phpPatterns,線上地址是http://www.phppatterns.com。

感謝

我很感謝我得老闆,在他那裡,我的工作和責任允許我在這個我感興趣的領域花費一部分時間,也感謝他給我提供知識和經驗讓我有信心寫完這本書。

我的靈感,想法和經驗的另外一個來源是SitePoint這個網站(http://www.sitepoint.com)的論壇。特別值得一提的,那些經 常上”Advanced PHP Forum”(譯者譯:PHP進階論壇)的投稿人都有著豐富的知識與經驗,他們是我在網上發現的最慷慨大方的共用自己想法的團體。我也正是通過這些資源 (譯者註:SitePoint網站)登陸了SimpleTest(http://simpletest.sf.net),WACT(http: //wact.sf.net)和其他許多我認為無價的PHP工程項目。在接下來的歲月裡,我希望SitePoint能夠繼續成為PHP開發人員的豐富資源 點。

沒有PHPTeam Dev的貢獻和重要的努力,這本書顯然是不可能存在的。因為正是他們開發出如此好用、易學、通用而且非常適合開發WEB應用程式的語言。

最後,我還要感謝Marco Tabini 和php|architect的全體成員。這本雜誌(譯者註:php|architect)已經成為許多不同PHP主題的來源,而且這些主題都是專業的開發人員發布的。由Macro和公司主辦的會議也是相當好的。

以上就是php教程:php設計模式之前言的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.