您好,登錄后才能下訂單哦!
php中抽象類與接口有哪些區別?這個問題可能是我們日常學習或工作經常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家帶來的參考內容,讓我們一起來看看吧!
區別:1、抽象類可以有屬性、普通方法、抽象方法,但接口不能有屬性、普通方法、可以有常量;2、抽象類用abstract關鍵字在類前聲明,且有class聲明為類,接口是用interface來聲明,但不能用class來聲明,因為接口不是類。
對于面向對象開發,抽象類與接口這兩個東西是比較難理解的。下面本篇文章給大家介紹一下php中抽象類與接口之間的區別。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。
抽象類:是基于類來說,其本身就是類,只是一種特殊的類,不能直接實例,可以在類里定義方法,屬性。類似于模版,規范后讓子類實現詳細功能。
接口:主要基于方法的規范,有點像抽象類里的抽象方法,只是其相對于抽象方法來說,更加獨立。可讓某個類通過組合多個方法來形成新的類。
php中抽象類與接口的區別
1、抽象類可以有屬性、普通方法、抽象方法,但接口不能有屬性、普通方法、可以有常量
2、抽象類內未必有抽象方法,但接口內一定會有“抽象”方法
3、語法上有不同
4、抽象類用abstract關鍵字在類前聲明,且有class聲明為類,接口是用interface來聲明,但不能用class來聲明,因為接口不是類。
5、抽象類的抽象方法一定要用abstract來聲明,而接口則不需要
6、抽象類是用extends關鍵字讓子類繼承父類后,在子類實現詳細的抽象方法。而接口則是用implements讓普通類在類里實現接口的詳細方法,且接口可以一次性實現多個方法,用逗號分開各個接口就可
抽象類:
抽象類無法被實例化,它的作用是為所有繼承自它的類定義(或部分實現)接口。
使用 abstract 關鍵字定義抽象類。
可以像在普通類中那樣在抽象類中創建方法和屬性,在大多數情況下,一個抽象類至少包含一個抽象方法,抽象方法也是通過 abstract 關鍵字聲明的。抽象方法只有方法聲明,沒有方法實現。不能編寫方法體。
abstract class ShopProductWriter { protected $product = []; /** * 抽象類中可以定義普通方法 */ public function addProduct($shopProduct) { $this->product = $shopProduct; } /** * 定義一個抽象方法,只有方法聲明,沒有方法實現 */ abstract public function write(); }
任何繼承自抽象類的類都必須實現所有的抽象方法,否則它自己就必須被定義為抽象類。子類不能僅僅實現抽象方法,還必須遵守方法簽名。這意味著實現方法的訪問控制不能比抽象方法更嚴格。實現方法還需要有與抽象方法相同數量的參數,以及相同的類型提示。
class XmlProductWriter extends ShopProductWriter { /** * 任何繼承自抽象類的類都必須實現所有的抽象方法 */ public function write() { echo 'XmlProductWriter'; } }
接口:
抽象類允許我們提供一些實現,但接口則是純粹的模板。接口只定義功能,不能有實現。可以有屬性和方法的聲明,但不能有方法體。
使用 interface 關鍵字聲明接口。
interface Price { /** * 只有方法聲明,沒有方法實現 */ public function getPrice(); }
任何實現該接口的類都必須實現這個接口定義的所有方法,否則這個類就只能被聲明為抽象類。
可以在類的聲明中使用 implements 關鍵字讓它實現接口。
class ShopProduct implements Price { protected $price; public function getPrice() { // TODO: Implement getPrice() method. return $this->price; } }
一個實現類與它所實現的接口具有相同的類型。
一個類可以在繼承一個父類的同時實現多個接口,implements 關鍵字后面跟著多個接口的名字,它們之間由逗號分隔開來。
感謝各位的閱讀!看完上述內容,你們對php中抽象類與接口有哪些區別大概了解了嗎?希望文章內容對大家有所幫助。如果想了解更多相關文章內容,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。