摘要:現(xiàn)代的面向?qū)ο蟮乃枷氩粡娬{(diào)為真實世界建模變得更加理性化一些,把目標(biāo)放在解耦上。各種語言中的多態(tài)多態(tài)確切的含義是同一類的對象收到相同消息時,會得到不同的結(jié)果。小結(jié)本章主要介紹面向?qū)ο笏枷氲某绦虻慕M成元素類和對象。
第一章 面向?qū)ο笏枷氲暮诵母拍?/b>
代碼:
class object { public $name; public $gender; public function say(){ echo $this->name."is".$this->gender; } } $student = new object(); $student->name = "Tom"; $student->gender = "male"; $student->say(); //由于PHP 的對象是用數(shù)組來模擬的,因此把對象轉(zhuǎn)換為數(shù)組,就能查看這個對象的所有屬性了 var_dump($student); var_dump((array)$student);//(array)對象類型轉(zhuǎn)換成數(shù)組,打印屬性值 var_dump(array($student)); print_r((array)$student); echo "1.3 繼承與多態(tài)
"; //對象序列化 $str = serialize($student); echo $str."
"; file_put_contents("store.txt",$str); //反序列化,取出這個對象 $str = file_get_contents("store.txt"); $student = unserialize($str); $student->say(); 結(jié)果: Tomismale object(object)[1] public "name" => string "Tom" (length=3) public "gender" => string "male" (length=4) array (size=2) "name" => string "Tom" (length=3) "gender" => string "male" (length=4) array (size=1) 0 => object(object)[1] public "name" => string "Tom" (length=3) public "gender" => string "male" (length=4) Array ( [name] => Tom [gender] => male ) O:6:"object":2:{s:4:"name";s:3:"Tom";s:6:"gender";s:4:"male";} Tomismale
面向?qū)ο蟮膬?yōu)勢在于類的復(fù)用。繼承與多態(tài)都是對類進(jìn)行復(fù)用,它們一個是類級別的復(fù)用,一個是方法級別的復(fù)用。提到繼承必提組合,二者有何異同?PHP到底有沒有多態(tài)?若沒有,則為什么沒有?有的話,和其他語言中
在繼承中,用parent指代父類,用self指代自身。使用“::”運算符(范圍解析操作符)調(diào)用父類的方法。
通過一些總結(jié),得出了繼承是一種“是、像”的關(guān)系,而組合是一種“需要”的關(guān)系。利用這條規(guī)律,就可以很簡單地判斷出父親與兒子應(yīng)該是繼承關(guān)系,父親與家庭應(yīng)該是組合關(guān)系。還可以從另外一個角度看,組合偏重整體與局部的關(guān)系,而繼承偏重父與子的關(guān)系。
????耦合是一個軟件結(jié)構(gòu)內(nèi)不同模塊之間互連程度的度量,也就是不同模塊之間的依賴關(guān)系。
低耦合指模塊與模塊之間,盡可能地使模塊間獨立存在;模塊與模塊之間的接口盡量少而簡單?,F(xiàn)代的面向?qū)ο蟮乃枷氩粡娬{(diào)為真實世界建模,變得更加理性化一些,把目標(biāo)放在解耦上。
解耦是要解除模塊與模塊之間的依賴。
按照這個思想,繼承與組合二者語義上難于區(qū)分,在二者均可使用的情況下,更傾向于使用組合。為什么呢?繼承存在什么問題呢?
????1)繼承破壞封裝性。
比如,定義鳥類為父類,具有羽毛屬性和飛翔方法,其子類天鵝、鴨子、鴕鳥等繼承鳥這個類。顯然,鴨子和鴕鳥不需要飛翔這個方法,但作為子類,它們卻可以無區(qū)別地使用飛翔這個方法,顯然破壞了類的封裝性。而組合,從語義上來說,要優(yōu)于繼承。
????2)繼承是緊耦合的。
繼承使得子類和父類捆綁在一起。組合僅通過唯一接口和外部進(jìn)行通信,耦合度低于繼承。
????3)繼承擴(kuò)展復(fù)雜。
隨著繼承層數(shù)的增加和子類的增加,將涉及大量方法重寫。使用組合,可以根據(jù)類型約束,實現(xiàn)動態(tài)組合,減少代碼。
????4)不恰當(dāng)?shù)厥褂美^承可能違反現(xiàn)實世界中的邏輯。
????多態(tài)確切的含義是:同一類的對象收到相同消息時,會得到不同的結(jié)果。而這個消息是不可預(yù)測的。多態(tài),顧名思義,就是多種狀態(tài),也就是多種結(jié)果。
????區(qū)別是否是多態(tài)的關(guān)鍵在于看對象是否屬于同一類型。如果把它們看做同一種類型,調(diào)用相同的函數(shù),返回了不同的結(jié)果,那么它就是多態(tài);否則,不能稱其為多態(tài)。由此可見,弱類型的PHP里多態(tài)和傳統(tǒng)強類型語言里的多態(tài)在實現(xiàn)和概念上是有一些區(qū)別的,而且弱類型語言實現(xiàn)起多態(tài)來會更簡單,更靈活。
????本節(jié)解決了什么是多態(tài),什么不是多態(tài)的問題。至于多態(tài)是怎么實現(xiàn)的,各種語言的策略是不一樣的。但是,最終的實現(xiàn)無非就是查表和判斷??偨Y(jié)如下:
????多態(tài)指同一類對象在運行時的具體化。
????PHP語言是弱類型的,實現(xiàn)多態(tài)更簡單、更靈活。
????類型轉(zhuǎn)換不是多態(tài)。
????PHP中父類和子類看做“繼父”和“繼子”關(guān)系,它們存在繼承關(guān)系,但不存在血緣關(guān)系。 因此子類無法向上轉(zhuǎn)型為父類,從而失去多態(tài)最典型的特征。
多態(tài)的本質(zhì)就是if…else,只不過實現(xiàn)的層級不同。
狹義的接口,即interface關(guān)鍵字。廣義的接口可以是任何一個對外提供服務(wù)的出口,比如提供數(shù)據(jù)傳輸?shù)腢SB接口、淘寶網(wǎng)對其他網(wǎng)站開放的支付寶接口。
接口作為一種規(guī)范和契約存在。作為規(guī)范,接口應(yīng)該保證可用性;作為契約,接口應(yīng)該保證可控性。
接口只是一個聲明,一旦使用interface關(guān)鍵字,就應(yīng)該實現(xiàn)它??梢杂沙绦騿T實現(xiàn)(外部接口),也可以由系統(tǒng)實現(xiàn)(內(nèi)部接口)。接口本身什么都不做,但是它可以告訴我們它能做什么。
PHP中的接口存在兩個不足,一是沒有契約限制,二是缺少足夠多的內(nèi)部接口。
接口其實很簡單,但是接口的各種應(yīng)用很靈活,設(shè)計模式中也有很大一部分是圍繞接口展開的。
面向?qū)ο缶幊讨袑ο蟊毁x予了自省的能力,而這個自省的過程就是反射。
反射,直觀理解就是根據(jù)到達(dá)地找到出發(fā)地和來源。比方說,我給你一個光禿禿的對象,我可以僅僅通過這個對象就能知道它所屬的類、擁有哪些方法。
反射指在PHP運行狀態(tài)中,擴(kuò)展分析PHP程序,導(dǎo)出或提取出關(guān)于類、方法、屬性、參數(shù)等的詳細(xì)信息,包括注釋。這種動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能稱為反射API。
本章主要介紹面向?qū)ο笏枷氲某绦虻慕M成元素——類和對象。類是一個動作和屬性的模板,對象是數(shù)據(jù)的集合。結(jié)合PHP自身實際情況,著重講述PHP里面向?qū)ο蟮囊恍┍容^模糊的知識點,包括魔術(shù)方法、接口、多態(tài)、類的復(fù)用、反射、異常機(jī)制等。接口是一種類型,從接口的實現(xiàn)講述接口是怎么實現(xiàn)“即插即用”的。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/22893.html
摘要:學(xué)習(xí)編程的本最佳書籍這些書涵蓋了各個領(lǐng)域,包括核心基礎(chǔ)知識,集合框架,多線程和并發(fā),內(nèi)部和性能調(diào)優(yōu),設(shè)計模式等。擅長解釋錯誤及錯誤的原因以及如何解決簡而言之,這是學(xué)習(xí)中并發(fā)和多線程的最佳書籍之一。 showImg(https://segmentfault.com/img/remote/1460000018913016); 來源 | 愿碼(ChainDesk.CN)內(nèi)容編輯 愿碼Slo...
摘要:耐得住寂寞,才能等得到花開慢慢積累自己的知識,不斷疊加,全面優(yōu)化,無論在哪個領(lǐng)域都可以有你的一席之地,即為有志者事竟成,破釜沉舟,百二秦關(guān)終屬楚也祝我們能向未來發(fā)展的開發(fā)者們苦心人天不負(fù),臥薪嘗膽,三千越甲可吞吳。 我們今天來了聊一聊一個話題——全棧開發(fā) 作為一個程序員,不管是Java還是C...
摘要:我們目前正處于一個新興的區(qū)塊鏈開發(fā)行業(yè)中。,一種在以太坊開發(fā)人員中流行的新的簡單編程語言,因為它是用于開發(fā)以太坊智能合約的語言。它是全球至少萬開發(fā)人員使用的世界上最流行的編程語言之一。以太坊,主要是針對工程師使用進(jìn)行區(qū)塊鏈以太坊開發(fā)的詳解。 我們目前正處于一個新興的區(qū)塊鏈開發(fā)行業(yè)中。區(qū)塊鏈技術(shù)處于初期階段,然而這種顛覆性技術(shù)已經(jīng)成功地風(fēng)靡全球,并且最近經(jīng)歷了一場與眾不同的繁榮。由于許多...
摘要:是企業(yè)與區(qū)塊鏈相遇的地方。的框架旨在成為開發(fā)區(qū)塊鏈解決方案的支柱。以太坊,主要是針對工程師使用進(jìn)行區(qū)塊鏈以太坊開發(fā)的詳解。 如果你想將區(qū)塊鏈合并到一個Java項目中,現(xiàn)在我們來看看就是這個細(xì)分領(lǐng)域中三個最大的OSS玩家。 好的伙計們,我們都聽說過比特幣,以太坊或其他加密貨幣,其中有一些時髦的名字圍繞著我們常見的新聞,但我們作為Java開發(fā)人員知道如何輕松地與這些區(qū)塊鏈技術(shù)進(jìn)行交互嗎?以...
閱讀 786·2021-08-23 09:46
閱讀 928·2019-08-30 15:44
閱讀 2586·2019-08-30 13:53
閱讀 3039·2019-08-29 12:48
閱讀 3847·2019-08-26 13:46
閱讀 1780·2019-08-26 13:36
閱讀 3510·2019-08-26 11:46
閱讀 1408·2019-08-26 10:48