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