成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP設(shè)計模式(三):封裝

dongxiawu / 2554人閱讀

摘要:原文地址設(shè)計模式三封裝面向?qū)ο缶幊讨?,一切都是對象,對一個對象的封裝,也成了面向?qū)ο缶幊讨斜夭豢缮俚牟糠?。封裝方法和別的程序設(shè)計語言一樣,也只是三種封裝概念,,。直接訪問和修改破壞了類的封裝性。

原文地址:PHP設(shè)計模式(三):封裝

Introduction

面向?qū)ο缶幊讨?,一切都是對象,對一個對象的封裝,也成了面向?qū)ο缶幊讨斜夭豢缮俚牟糠帧?br>和C/C++,Java,Python等語言一樣,PHP也支持封裝。

封裝/Encapsulation

對事物的封裝是指,將事物進行抽象后,提供抽象概念的實現(xiàn)的具體方法。

聽起來很拗口,還是舉鯨魚的例子。
對于鯨魚來說,需要吃東西這個行為,吃本身是一個抽象的概念,因為具體到怎么吃,是咀嚼和消化的過程,甚至如何咀嚼和消化也是不可見的。對外部而言,可見的只是吃這一個接口,如何吃、怎么吃,是被封裝在了鯨魚的實現(xiàn)中。
甚至可以說,消化系統(tǒng),被封裝到了鯨魚這個對象中,對外部不可見,僅僅鯨魚自己可見。

封裝方法

和別的程序設(shè)計語言一樣,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)實來說,我們?nèi)绻皇亲⒅爻?,并沒有必要去關(guān)心鯨魚是如何去吃的。

保護/Protected

保護的概念是,僅僅是自身類和繼承類可見,這個關(guān)鍵字的用途主要是防止濫用類的派生,另外三方庫編寫的時候會用到,防止誤用。

name = "Whale";
  }
  public function eat($food) {
    chew($food);
    digest($food);
  }
}
?>

鯨魚類可以通過繼承使用動物類的咀嚼和消化方法,但是別的繼承鯨魚類的類就不可以再使用動物類的咀嚼和消化方法了。保護更多是用于面向?qū)ο笤O(shè)計,而不是為了編程來實現(xiàn)某個需求。

公共/Public

公共的概念就是,任何類、任何事物都可以訪問,沒有任何限制,這里不再贅述。

Getters/Setters

Getters和Setters也叫Accessors和Mutators,在Java/C#等語言中常以get()/set()方法出現(xiàn)。
對于這兩個東西的爭議很大,考慮下面一個類:

如果不使用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是編程設(shè)計方法,而不是編程實現(xiàn)方法。

在面向?qū)ο蟪绦蛟O(shè)計中,類和類之間的訪問、交互和更新應(yīng)該是通過Accessors和Mutators,也就是Getters和Setters來實現(xiàn)。直接訪問和修改破壞了類的封裝性。

為什么采用這種設(shè)計方式?因為程序設(shè)計是對現(xiàn)實問題的抽象,而在編程的工程中程序員扮演的角色往往是上帝。
考慮這樣一種場景:你朋友要求你改名,決定是否改名的人是你,而不是你朋友。在你的朋友的視覺(也就是你朋友的類),他不能直接去修改你的名字。
如果你直接采用非Getters/Setters的設(shè)計方法,事實上是程序員扮演的這個上帝修改了現(xiàn)實規(guī)則,允許你朋友能夠隨意更改你的姓名,顯然這是不合理的。

Summary

合理的封裝對于好的程序設(shè)計是必不可少的,雖然什么都是Public也能解決編程問題,但是這不是用程序設(shè)計解決問題的思路。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21510.html

相關(guān)文章

  • PHP面試之面向?qū)ο螅?)

    摘要:二面向?qū)ο笥惺裁刺卣髅嫦驅(qū)ο蟮闹饕卣饔谐橄罄^承封裝和多態(tài)。析構(gòu)函數(shù)析構(gòu)函數(shù)是在引入的,它的作用與調(diào)用時機和構(gòu)造函數(shù)剛好相反,它在對象被銷毀時自動執(zhí)行。 PHP面試專欄正式起更,每周一、三、五更新,提供最好最優(yōu)質(zhì)的PHP面試內(nèi)容。PHP中面向?qū)ο蟪?嫉闹R點有以下7點,我將會從以下幾點進行詳細介紹說明,幫助你更好的應(yīng)對PHP面試??嫉拿嫦?qū)ο笙嚓P(guān)的知識點和考題。整個面向?qū)ο笪恼碌慕Y(jié)構(gòu)涉...

    phodal 評論0 收藏0
  • 基于 Laravel Route 的 社交系統(tǒng)ThinkSNS+ Component【研發(fā)日記系列

    摘要:在社交系統(tǒng)中有這樣一個命令主要是用作包的安裝,升級,卸載。這在開發(fā)過程中很有用。內(nèi)測申請方式提供個人企業(yè)聯(lián)系方式及認證信息實名企業(yè)營業(yè)執(zhí)照照片或掃描件及申請說明,發(fā)送郵件至將有機會獲得首批內(nèi)測資格,名額有限,申請從速。 在前面,我介紹了拓展類型,分別有 plus-compnent 和 plus-plugin 兩個,這里重點講以下如何實現(xiàn) plus-component 的。 plus-c...

    pf_miles 評論0 收藏0
  • 各開源框架使用與設(shè)計總結(jié)(

    摘要:總結(jié)了框架與架構(gòu)的區(qū)別。站在框架之外,看框架,看框架的共同特征與功用。由于框架所帶來的問題,以性能可擴展問題,相對嚴(yán)重,所以分析性能的改造方向,總結(jié)了六大點。包括框架介紹,的使用,以及。 六、各項實踐,性能評測 下面進入性能評測,評測我們相對就比較快速一些。直接用ab命令,來測試上面的所提及的一些改進。 以下評測,所有測試頁面,均為:http://hjvote.app.ucai.cn/...

    objc94 評論0 收藏0
  • PHP設(shè)計模式(二)工廠方法模式(Factory Method)

    摘要:對于這個問題,接下來的工廠方法模式可以解決這個問題。二工廠方法模式的優(yōu)點擁有良好的封裝性,代碼結(jié)構(gòu)清晰。參考系列源地址系列目錄設(shè)計模式概述設(shè)計模式一簡單工廠模式設(shè)計模式二工廠方法模式設(shè)計模式三抽象工廠模式設(shè)計模式四單例模式 簡單工廠簡述: 簡單工廠模式實現(xiàn)了產(chǎn)品類的代碼跟客戶端代碼分離,但會有一個問題,優(yōu)秀的代碼是符合開閉原則如果你要加一個C類產(chǎn)品,你就要修改工廠類里面的代碼,也就是說...

    zhjx922 評論0 收藏0
  • polarphp:一個新的 PHP 語言運行時環(huán)境

    摘要:項目介紹是一個全新的語言的運行時環(huán)境,基于目前最新的進行打造,支持最新的語言規(guī)范,同時提供了自己的運行時標(biāo)準(zhǔn)庫。同樣也在的基礎(chǔ)上進行打造,實現(xiàn)了一個除開發(fā)之外的一個全新的運行環(huán)境。發(fā)布核心虛擬機的鏡像。整合運行時框架。 showImg(https://segmentfault.com/img/bVbnQXK); polarphp 項目介紹 polarphp是一個全新的PHP語言的運行時...

    宋華 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<