摘要:原文地址設計模式三封裝面向對象編程中,一切都是對象,對一個對象的封裝,也成了面向對象編程中必不可少的部分。封裝方法和別的程序設計語言一樣,也只是三種封裝概念,,。直接訪問和修改破壞了類的封裝性。
Introduction原文地址:PHP設計模式(三):封裝
面向對象編程中,一切都是對象,對一個對象的封裝,也成了面向對象編程中必不可少的部分。
和C/C++,Java,Python等語言一樣,PHP也支持封裝。
對事物的封裝是指,將事物進行抽象后,提供抽象概念的實現的具體方法。
聽起來很拗口,還是舉鯨魚的例子。
對于鯨魚來說,需要吃東西這個行為,吃本身是一個抽象的概念,因為具體到怎么吃,是咀嚼和消化的過程,甚至如何咀嚼和消化也是不可見的。對外部而言,可見的只是吃這一個接口,如何吃、怎么吃,是被封裝在了鯨魚的實現中。
甚至可以說,消化系統,被封裝到了鯨魚這個對象中,對外部不可見,僅僅鯨魚自己可見。
和別的程序設計語言一樣,PHP也只是三種封裝概念:Private,Protected,Public。
私有/Private私有的概念是,僅僅對象內部可見,外部不可見,如:
name = "Whale"; } public function eat($food) { chew($food); digest($food); } private function chew($food) { echo "Chewing " . $food . " "; } private function digest($food) { echo "Digest " . $food . " "; } } ?>
name是鯨魚的私有屬性,chew()和digest()是鯨魚的私有方法,對于其他類來說,都是不可見的。對于現實來說,我們如果只是注重吃,并沒有必要去關心鯨魚是如何去吃的。
保護/Protected保護的概念是,僅僅是自身類和繼承類可見,這個關鍵字的用途主要是防止濫用類的派生,另外三方庫編寫的時候會用到,防止誤用。
name = "Whale"; } public function eat($food) { chew($food); digest($food); } } ?>
鯨魚類可以通過繼承使用動物類的咀嚼和消化方法,但是別的繼承鯨魚類的類就不可以再使用動物類的咀嚼和消化方法了。保護更多是用于面向對象設計,而不是為了編程來實現某個需求。
公共/Public公共的概念就是,任何類、任何事物都可以訪問,沒有任何限制,這里不再贅述。
Getters/SettersGetters和Setters也叫Accessors和Mutators,在Java/C#等語言中常以get()/set()方法出現。
對于這兩個東西的爭議很大,考慮下面一個類:
如果不使用Getters/Setters,我們給Price類賦值和取值一般是這樣:
priceA = 1; $price->priceB = 2; $price->priceC = 3; ... echo $price->priceA; echo $price->priceB; echo $price->priceC; ... ?>
但是如果使用了Getters/Setters,Price類將變成這樣:
priceA; } public function setPriceA($price) { $this->priceA = $price; } ... } ?>
這時候賦值將變成這樣:
setpriceA(1); $price->setPriceB(2); $price->setPriceC(3); ... echo $price->getPriceA(); echo $price->getPriceB(); echo $price->getPriceC(); ... ?>
是不是感覺需要多敲很多代碼?這也是很多程序員不愿意使用get/set的原因,造成了大量的看似無用冗余的代碼。
為什么叫看似冗余和無用?因為Getters/Setters是編程設計方法,而不是編程實現方法。
在面向對象程序設計中,類和類之間的訪問、交互和更新應該是通過Accessors和Mutators,也就是Getters和Setters來實現。直接訪問和修改破壞了類的封裝性。
為什么采用這種設計方式?因為程序設計是對現實問題的抽象,而在編程的工程中程序員扮演的角色往往是上帝。
考慮這樣一種場景:你朋友要求你改名,決定是否改名的人是你,而不是你朋友。在你的朋友的視覺(也就是你朋友的類),他不能直接去修改你的名字。
如果你直接采用非Getters/Setters的設計方法,事實上是程序員扮演的這個上帝修改了現實規則,允許你朋友能夠隨意更改你的姓名,顯然這是不合理的。
合理的封裝對于好的程序設計是必不可少的,雖然什么都是Public也能解決編程問題,但是這不是用程序設計解決問題的思路。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/21510.html
摘要:二面向對象有什么特征面向對象的主要特征有抽象繼承封裝和多態。析構函數析構函數是在引入的,它的作用與調用時機和構造函數剛好相反,它在對象被銷毀時自動執行。 PHP面試專欄正式起更,每周一、三、五更新,提供最好最優質的PHP面試內容。PHP中面向對象??嫉闹R點有以下7點,我將會從以下幾點進行詳細介紹說明,幫助你更好的應對PHP面試??嫉拿嫦驅ο笙嚓P的知識點和考題。整個面向對象文章的結構涉...
摘要:在社交系統中有這樣一個命令主要是用作包的安裝,升級,卸載。這在開發過程中很有用。內測申請方式提供個人企業聯系方式及認證信息實名企業營業執照照片或掃描件及申請說明,發送郵件至將有機會獲得首批內測資格,名額有限,申請從速。 在前面,我介紹了拓展類型,分別有 plus-compnent 和 plus-plugin 兩個,這里重點講以下如何實現 plus-component 的。 plus-c...
摘要:總結了框架與架構的區別。站在框架之外,看框架,看框架的共同特征與功用。由于框架所帶來的問題,以性能可擴展問題,相對嚴重,所以分析性能的改造方向,總結了六大點。包括框架介紹,的使用,以及。 六、各項實踐,性能評測 下面進入性能評測,評測我們相對就比較快速一些。直接用ab命令,來測試上面的所提及的一些改進。 以下評測,所有測試頁面,均為:http://hjvote.app.ucai.cn/...
摘要:對于這個問題,接下來的工廠方法模式可以解決這個問題。二工廠方法模式的優點擁有良好的封裝性,代碼結構清晰。參考系列源地址系列目錄設計模式概述設計模式一簡單工廠模式設計模式二工廠方法模式設計模式三抽象工廠模式設計模式四單例模式 簡單工廠簡述: 簡單工廠模式實現了產品類的代碼跟客戶端代碼分離,但會有一個問題,優秀的代碼是符合開閉原則如果你要加一個C類產品,你就要修改工廠類里面的代碼,也就是說...
摘要:項目介紹是一個全新的語言的運行時環境,基于目前最新的進行打造,支持最新的語言規范,同時提供了自己的運行時標準庫。同樣也在的基礎上進行打造,實現了一個除開發之外的一個全新的運行環境。發布核心虛擬機的鏡像。整合運行時框架。 showImg(https://segmentfault.com/img/bVbnQXK); polarphp 項目介紹 polarphp是一個全新的PHP語言的運行時...
閱讀 1000·2023-04-25 14:20
閱讀 1876·2021-11-24 10:20
閱讀 3774·2021-11-11 16:55
閱讀 2919·2021-10-14 09:42
閱讀 3472·2019-08-30 15:56
閱讀 1163·2019-08-30 15:55
閱讀 1072·2019-08-30 15:44
閱讀 782·2019-08-29 11:28