抽象類 抽象類無法被實例化,它的作用是為所有繼承自它的類定義(或部分實現)介面。 使用 abstract 關鍵字定義抽象類。 可以像在普通類中那樣在抽象類中創建方法和屬性,在大多數情況下,一個抽象類至少包含一個抽象方法,抽象方法也是通過 abstract 關鍵字聲明的。抽象方法只有方法聲明,沒有方法 ...
抽象類
- 抽象類無法被實例化,它的作用是為所有繼承自它的類定義(或部分實現)介面。
- 使用 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 關鍵字後面跟著多個介面的名字,它們之間由逗號分隔開來。