扫码一下
查看教程更方便
抽象类
和 抽象方法
PHP 5 支持抽象类和抽象方法。定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则两者的声明并无冲突。 这也适用于 PHP 5.4 起的构造函数。在 PHP 5.4 之前的构造函数声明可以不一样的。
abstract class YourClassName{
public $name;
abstract public function method1();
abstract public function method2();
public function method3(){
... ... ;
}
}
抽象类 是在class
关键字前面加一个 abstract
关键字。抽象方法是在访问权限修饰符(public、protected或者 private)前面加上 abstract关键字。
说明:抽象类是不能被实例化的,继承了抽象类,则要把抽象类里的抽象方法都实现。这一点和接口有点像,实现接口就要把接口中的所有方法都实现。 反过来,如果一个类里定义了一个抽象方法,那这个类就必须是抽象类。
一个抽象类示例
<?php
abstract class AbstractClass
{
abstract protected function method1();
}
class WebSite extends AbstractClass
{
public function welcome()
{
echo "Hello 迹忆客 \n";
$this->method1();
$this->method2();
}
protected function method1()
{
echo "This is protected! \n";
}
private function method2()
{
echo "This is private! \n";
}
}
$obj = new WebSite;
$obj->welcome();
?>
以上示例输出
Hello 迹忆客
This is protected!
This is private!
注意:抽象方法只能是 public 或者 protected。在 继承 一节中我们介绍过,父类中的 private 成员是不能被子类继承的。如果在抽象类中存在private的抽象方法,那在子类中又必须实现抽象方法,而子类又不能访问父类的private方法,这就麻烦了。所以php中对于将private方法定义成抽象方法的情况,直接报错
<?php abstract class AbstractClass { abstract protected function method1(); abstract private function method2(); // 将 private 修饰的方法设置为抽象方法 } class WebSite extends AbstractClass { public function welcome() { echo "Hello 迹忆客\n"; $this->method1(); $this->method2(); } protected function method1() { echo "This is protected!\n"; } private function method2() { echo "This is private\n"; } } $obj = new WebSite; $obj->welcome(); ?>
上述代码执行结果
PHP Fatal error: Abstract function AbstractClass::method2() cannot be declared private