抽象類就是一個普通的類,區別是抽象類中申明了一些函數,這些函數的功能必須由子類來實現。
抽象類不能實例化。
任何一個類,只要其中有一個方法被定義為抽象的,那么這個類就必須是抽象的。
抽象類中可以沒有抽象方法,但這樣就沒有意義了。
被定義為抽象的方法只能進行聲明(如名稱、參數、返回值),但不能有函數體。
繼承一個抽象類時,子類必須實現父類中的所有抽象方法,且這些方法訪問級別必須和父類中一樣或是級別更大。
實現父類方法時,參數和返回值必須一致,允許增加有默認值的參數。
// 抽象類
abstract class Foo{
// 抽象方法不能有函數體
abstract protected function hello(int $i, string $s) : int;
abstract protected function world(bool $b, float $f);
abstract protected function temp(int $i);
// 普通方法可以有函數體
protected function fn(){
echo "父類的普通方法<br />";
}
}
// 子類
class Bar extends Foo{
// 參數必須和父類一樣
protected function hello(int $i, string $s) : int{
echo "子類的hello方法 <br />";
}
// 訪問級別可以更大、也可以增加一個有默認值的參數
public function world(bool $b, float $f, int $i = 123){
echo "子類的world方法 <br />";
}
// 子類的參數可以設置默認值
public function temp(int $i = 123){
// 子類實現的方法必須有函數體
}
// 普通方法重寫
public function fn(){
echo "子類的普通方法<br />";
}
}