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