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

results matching ""

    No results matching ""