抽象类就是一个普通的类,区别是抽象类中申明了一些函数,这些函数的功能必须由子类来实现。
抽象类不能实例化。
任何一个类,只要其中有一个方法被定义为抽象的,那么这个类就必须是抽象的。
抽象类中可以没有抽象方法,但这样就没有意义了。
被定义为抽象的方法只能进行声明(如名称、参数、返回值),但不能有函数体。
继承一个抽象类时,子类必须实现父类中的所有抽象方法,且这些方法访问级别必须和父类中一样或是级别更大。
实现父类方法时,参数和返回值必须一致,允许增加有默认值的参数。
// 抽象类
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 />";
}
}