PHP 5 支援抽象類別和抽象方法。定義為抽象的類別不能被實例化。任何一個類,如果它裡面至少有一個方法是被聲明為抽象的,那麼這個類別就必須被宣告為抽象的。被定義為抽象的方法只是聲明了其呼叫方式(參數),不能定義其特定的功能實作。
繼承一個抽象類別的時候,子類別必須定義父類別中的所有抽象方法;另外,這些方法的存取控制必須和父類別中一樣(或更為寬鬆)。例如某個抽象方法被宣告為受保護的,那麼子類別中實作的方法就應該宣告為受保護的或公有的,而不能定義為私有的。此外方法的呼叫方式必須匹配,即類型和所需參數數量必須一致。例如,子類別定義了一個可選參數,而父類別抽象方法的聲明裡沒有,則兩者的宣告並無衝突。 這也適用於 PHP 5.4 起的建構子。在 PHP 5.4 之前的建構子宣告可以是不一樣的。
Example #1 抽象類別範例
abstract class AbstractClass { //强制要求子类定义这些方法 abstract protected function getValue(); abstract protected function prefixValue($prefix); //普通方法(非抽象方法) public function printOut() { print $this->getValue().'<br>'; } } class ConcreteClass1 extends AbstractClass { protected function getValue() { return "ConcteteClass1"; } public function prefixValue($prefix){ return "{$prefix}ConcreteClass1"; } } class ConcreteClass2 extends AbstractClass { public function getValue(){ return "ConcreteClass2"; } public function prefixValue($prefix){ return "{$prefix}ConcreteClass2"; } } $class1 = new ConcreteClass1; $class1 -> printOut(); echo $class1->prefixValue('Foo_')."<br>"; $class2 = new ConcreteClass2; $class2 -> printOut(); echo $class2->prefixValue('Bar_')."<br>";
輸出結果:
ConcteteClass1
Foo_ConcreteClass1
ConcreteClass2
Mr. PacmanMrs. Pacwoman