PHP 抽象类

PHP 抽象类抽象方法


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

查看笔记

扫码一下
查看教程更方便