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