abstract 抽象類別
原有功能:
class Name {
protected $name = 'Ann';
public function get_name(){
return $this->name;
}
}
$name = new Name();
echo $name->get_name();
Output:
Ann
接口 抽象類別 (abstract class)
在物件導向中,介面可以當成是對物件的方法定義一個規範,繼承物件必須遵從介面所定義的法方去實作。
連接原有功能及新功能的中介類別,也檢查子類別屬性及方法的完整性,避免錯誤;本例若無檢查繼承的子類別 class Hello 的 $name 屬性的情況,很有可能在繼承的時候,忘記加上 $name 此一屬性,而導致異常。
abstract class Say extends Name {
protected $name;
public final function __construct(){
/* 檢查繼承的子類別是否擁有指定屬性,無則報錯,確保擁有該屬性 */
if(!isset($this->name)) throw new LogicException(get_class($this) . ' 子類缺少屬性:$name');
}
/* 虛擬方法 - 不會被實作,限制子類別有hi()這方法 */
abstract public function hi();
/* 靜態方法 - 子類別實作 */
public function get_hi(){
return 'hi:';
}
}
新功能:
class Hello extends Say {
public $name = 'Jack';
public function hi() {
echo $this->get_hi();
echo $this->get_name();
}
}
$hello = new Hello();
$hello -> hi();
Output:
hi:Jack
abstract class Say extends Name {
abstract protected $name;
}
抽象不支援抽象屬性 Fatal error: Properties cannot be declared abstract
虛擬類別 abstract class abs_tablename 不可被實體化
參考資料
PHP abstract properties http://stackoverflow.com/questions/7634970/php-abstract-properties