摘要:抽象類支持抽象類和抽象方法。接口是一種特殊的抽象類,這種抽象類中只包含抽象方法和靜態(tài)常量。對(duì)抽象類的使用是通過(guò)關(guān)鍵字。抽象類中可以聲明各種類型成員變量,實(shí)現(xiàn)數(shù)據(jù)的封裝。一個(gè)類可以同時(shí)實(shí)現(xiàn)多個(gè)接口,但一個(gè)類只能繼承于一個(gè)抽象類。
抽象類
php5支持抽象類和抽象方法。類前加 abstract, 此類就成為抽象類,無(wú)法被實(shí)例化,此類天生就是用來(lái)被繼承的,給子類提供了一個(gè)類的模板;
類方法前加 abstract,是抽象方法,抽象方法不能有方法體;
總結(jié)下來(lái)抽象類有以下幾個(gè)特點(diǎn):
類中有抽象方法,則此類一定要是抽象類;否則會(huì)報(bào)錯(cuò);
抽象類中的方法不一定都是抽象方法;
決定類是否能被實(shí)例化取決于其是不是抽象類,就算其類中的方法全部都是具體的方法而類本身是抽象方法的話,也不能被實(shí)例化
抽象類中全是具體方法,但是抽象類又不能被實(shí)例化,又想用其里面的具體方法時(shí),就可以通過(guò)繼承的方式或者通過(guò)類來(lái)調(diào)用;
抽象類是用作被繼承的類,所以其中的方法必須是public或者protected,又由于子類繼承其父類不能令其權(quán)限越來(lái)越嚴(yán)格的規(guī)則,其子類也必須public或者protected;
如果是一個(gè)非抽象類繼承抽象類,就必須要完成抽象類中的所有的所有抽象方法(并且參數(shù)及其參數(shù)的類型要一樣),但如果是一個(gè)抽象類繼承一個(gè)抽象類的話可以不必完成抽象類中的抽象方法(抽象類繼承抽象類的目的就是擴(kuò)展被繼承的抽象類);
以下代碼摘抄自燕十八公益課堂
/* 春秋戰(zhàn)國(guó)時(shí)期,燕零七 飛行器專家,能工巧匠. 他寫了一份圖紙---飛行器制造術(shù) 飛行器秘制圖譜 1: 要有一個(gè)有力的發(fā)動(dòng)機(jī),噴氣式. 2: 要有一個(gè)平衡舵,掌握平衡 他的孫子問(wèn): 發(fā)動(dòng)機(jī)怎么造呢? 燕零七眼望夕陽(yáng): 我是造不出來(lái),但我相信后代有人造出來(lái) 燕零七的構(gòu)想在當(dāng)時(shí)的科技造不出來(lái),即這個(gè)類只能在圖紙化,無(wú)法實(shí)例化. ***/ // 此時(shí)這個(gè)類沒(méi)有具體的方法去實(shí)現(xiàn),還太抽象. // 因此我們把他做成一個(gè)抽象類 abstract class FlyIdea { // 大力引擎,當(dāng)時(shí)也沒(méi)法做,這個(gè)方法也實(shí)現(xiàn)不了,因此方法也是抽象的 public abstract function engine(); // 平衡舵 public abstract function blance(); /* 注意:抽象方法 不能有方法體 下面這樣寫是錯(cuò)誤的 public abstract function blance() { } Fatal error: Abstract function FlyIdea::engine() cannot contain body */ } /* 抽象類不能 new 來(lái)實(shí)例化 下面這行是錯(cuò)誤的 $kongke = new FlyIdea(); Cannot instantiate abstract class FlyIdea */ // 到了明朝,萬(wàn)戶用火箭解決了發(fā)動(dòng)機(jī)的問(wèn)題 abstract class Rocket extends FlyIdea { // 萬(wàn)戶把engine方法,給實(shí)現(xiàn)了,不再抽象了 public function engine() { echo "點(diǎn)燃火藥,失去平衡,嘭!接口
"; } // 但是萬(wàn)戶實(shí)現(xiàn)不了平衡舵,因此平衡舵對(duì)于Rocket類來(lái)說(shuō),還是抽象的,類也是抽象的 // 此處由于繼承父類的也是抽象類,所以可以不必完成抽象類中的所有抽象方法; } /* 到了現(xiàn)代,燕十八親自制作飛行器 這個(gè)Fly類中,所以抽象方法,都已經(jīng)實(shí)現(xiàn)了,不再是夢(mèng)想. */ //到了這個(gè)類就必須要完成所有的抽象方法; class Fly extends Rocket{ public function engine() { echo "有力一扔
"; } public function blance() { echo "兩個(gè)紙翼保持平衡~~~"; } public function start() { $this->engine(); for($i=0;$i<10;$i++) { $this->blance(); echo "平穩(wěn)飛行
"; } } } $apache = new Fly(); $apache->start();
接口是 PHP對(duì)象之間的契約,抽象方法和靜態(tài)常量定義的集合。接口是一種特殊的抽象類,這種抽象類中只包含抽象方法和靜態(tài)常量。接口中沒(méi)有其它類型的內(nèi)容。
總結(jié)如下:
接口是某類事物功能的抽象,本身方法默認(rèn)全部是抽象的,不能有方法體;
接口的作用:指定了implements這些接口的類必須要包含接口里面的方法以及方法里面的參數(shù),缺一不可。當(dāng)然除了包含接口的這些方法外,可以增加其他的一些方法;
接口是可以繼承的
接口是一堆方法的說(shuō)明,不能加屬性,但可以定義常量,定義的常量是不能被覆蓋,訪問(wèn)方法是 接口名::常量名 或者 self::常量名
接口的方法必須是public;
類可以實(shí)現(xiàn)多接口
以下代碼來(lái)自燕十八的公益課堂
think(); ?>區(qū)別
對(duì)接口的使用是通過(guò)關(guān)鍵字implements。對(duì)抽象類的使用是通過(guò)關(guān)鍵字extends。當(dāng)然接口也可以通過(guò)關(guān)鍵字extends繼承但最好還是通過(guò)implements實(shí)現(xiàn)。
接口中不可以聲明成員變量(包括類靜態(tài)變量),但是可以聲明類常量。抽象類中可以聲明各種類型成員變量,實(shí)現(xiàn)數(shù)據(jù)的封裝。
接口中只有抽象方法沒(méi)有具體的方法,抽象類可以有具體的方法。
接口中的方法默認(rèn)都是public類型的,而抽象類中的方法可以使用protected,public來(lái)修飾(其實(shí)抽象類也可以聲明private方法的,不過(guò)沒(méi)有意義)。
一個(gè)類可以同時(shí)實(shí)現(xiàn)多個(gè)接口,但一個(gè)類只能繼承于一個(gè)抽象類。
使用接口還是抽象類?如果要?jiǎng)?chuàng)建一個(gè)模型,這個(gè)模型將由一些緊密相關(guān)的對(duì)象采用,就可以使用抽象類。如果要?jiǎng)?chuàng)建將由一些不相關(guān)對(duì)象采用的功能,就使用接口。
如果必須從多個(gè)來(lái)源繼承行為,就使用接口(只有接口能繼承多個(gè))。
如果知道所有類都會(huì)共享一個(gè)公共的行為實(shí)現(xiàn),就使用抽象類,并在其中實(shí)現(xiàn)該行為。
應(yīng)用場(chǎng)景舉例更多的應(yīng)用場(chǎng)景可以參考一些國(guó)外框架,比如YII
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/31378.html
摘要:而依賴倒置原則的思想是,上層不應(yīng)該依賴下層,應(yīng)依賴接口。上面通過(guò)構(gòu)造函數(shù)注入對(duì)象的方式,就是最簡(jiǎn)單的依賴注入當(dāng)然注入不僅可以通過(guò)構(gòu)造函數(shù)注入,也可以通過(guò)屬性注入,上面你可以通過(guò)一個(gè)來(lái)動(dòng)態(tài)為這個(gè)屬性賦值。 依賴倒置和控制反轉(zhuǎn)是一種編程思想,而依賴注入就是通過(guò)服務(wù)容器實(shí)現(xiàn)這種面向接口或者是面向抽象編程的思想 概念理解 依賴倒置原則 依賴倒置是一種軟件設(shè)計(jì)思想,在傳統(tǒng)軟件中,上層代碼依賴于下...
摘要:概述是新進(jìn)入的特性,其目的就是解決的類不能多繼承的問(wèn)題??梢岳斫鉃橐唤M能被不同的類都能調(diào)用到的方法集合。只需要在類中使用關(guān)鍵詞引入即可,可引入多個(gè),用隔開(kāi)。為了解決多個(gè)在同一個(gè)類中的命名沖突,需要使用操作符來(lái)明確指定使用沖突方法中的哪一個(gè)。 概述 traits是PHP5.4新進(jìn)入的特性,其目的就是解決PHP的類不能多繼承的問(wèn)題。Traits不是類!不能被實(shí)例化。可以理解為一組能被不同的...
摘要:它使得在生產(chǎn)環(huán)境中啟用斷言為零成本,并且提供當(dāng)斷言失敗時(shí)拋出特定異常的能力。錯(cuò)誤和異常改變了大多數(shù)錯(cuò)誤的報(bào)告方式。不同于傳統(tǒng)的錯(cuò)誤報(bào)告機(jī)制,現(xiàn)在大多數(shù)錯(cuò)誤被作為異常拋出。 PHP7性能 7最大的亮點(diǎn),應(yīng)該就是性能提高了兩倍,某些測(cè)試環(huán)境下甚至提高到三到五倍,具體可以了解以下鏈接: PHP7 VS HHVM (WordPress) HHVM vs PHP 7 – The Competit...
摘要:起就在中內(nèi)置了服務(wù)器但只是提供開(kāi)發(fā)測(cè)試使用,不推薦使用中生產(chǎn)環(huán)境中。因?yàn)檫@個(gè)服務(wù)器接受處理請(qǐng)求時(shí)順序執(zhí)行的,不能并發(fā)處理。這個(gè)內(nèi)置的服務(wù)器使用起來(lái)非常的方便,你只需要執(zhí)行下面的命令啟動(dòng)服務(wù)器然后就可以訪問(wèn)了。 PHP 5.4起就在CLI SAPI中內(nèi)置了web服務(wù)器,但只是提供開(kāi)發(fā)測(cè)試使用,不推薦使用中生產(chǎn)環(huán)境中。因?yàn)檫@個(gè)服務(wù)器接受處理請(qǐng)求時(shí)順序執(zhí)行的,不能并發(fā)處理。 這個(gè)內(nèi)置的web...
摘要:實(shí)例化對(duì)象里面的所在哪個(gè)類就返回哪個(gè)類。訪問(wèn)的是當(dāng)前類有點(diǎn)像因?yàn)槠涫抢^承了的方法,而調(diào)用的。由此可見(jiàn),他們的區(qū)別只有在繼承中才能體現(xiàn)出來(lái),如果沒(méi)有任何繼承,那么這兩者是沒(méi)有區(qū)別的。但如果是在靜態(tài)方法內(nèi)本類的話,最好還是用 以static::來(lái)調(diào)用,是在運(yùn)行的那個(gè)時(shí)刻才執(zhí)行綁定操作; 父類中有個(gè)方法是延遲綁定的,在子類::調(diào)用這個(gè)方法的時(shí)候它又回到調(diào)用的子類開(kāi)始向上找; exampl...
閱讀 2187·2021-09-22 16:05
閱讀 9522·2021-09-22 15:03
閱讀 2946·2019-08-30 15:53
閱讀 1766·2019-08-29 11:15
閱讀 975·2019-08-26 13:52
閱讀 2434·2019-08-26 11:32
閱讀 1876·2019-08-26 10:38
閱讀 2640·2019-08-23 17:19