PHP课程

浏览13601
更新时间2025-08-06

PHP - 什么是抽象类和抽象方法?

抽象类和抽象方法是当父类有一个命名的方法,但需要其子类来完成具体任务时使用的。

抽象类是一个至少包含一个抽象方法的类。抽象方法是声明了但在代码中未实现的方法。

抽象类或抽象方法使用 abstract 关键字来定义:

语法

<?php
abstract class ParentClass {
  abstract public function someMethod1();
  abstract public function someMethod2($name, $color);
  abstract public function someMethod3() : string;
}
?>

当从抽象类继承时,子类方法必须使用相同的名称,以及相同或更宽松的访问修饰符。因此,如果抽象方法被定义为 protected,子类方法必须定义为 protectedpublic,但不能是 private。此外,必需参数的类型和数量必须相同。但是,子类可以拥有额外的可选参数。

因此,当子类从抽象类继承时,我们遵循以下规则:

  • 子类方法必须使用相同的名称并重新声明父类的抽象方法
  • 子类方法必须使用相同或更宽松的访问修饰符
  • 必需参数的数量必须相同。但是,子类可以拥有额外的可选参数

让我们看一个例子:

实例

<?php
// 父类
abstract class Car {
  public $name;
  public function __construct($name) {
    $this->name = $name;
  }
  abstract public function intro() : string;
}

// 子类
class Audi extends Car {
  public function intro() : string {
    return "选择德国品质!我是$this->name!";
  }
}

class Volvo extends Car {
  public function intro() : string {
    return "为身为瑞典人而自豪!我是$this->name!";
  }
}

class Citroen extends Car {
  public function intro() : string {
    return "法国奢华!我是$this->name!";
  }
}

// 从子类创建对象
$audi = new audi("Audi");
echo $audi->intro();
echo "<br>";

$volvo = new volvo("Volvo");
echo $volvo->intro();
echo "<br>";

$citroen = new citroen("Citroen");
echo $citroen->intro();
?>
运行实例 »

点击 "运行实例" 按钮查看在线实例

例子解释

Audi、Volvo 和 Citroen 类继承自 Car 类。这意味着 Audi、Volvo 和 Citroen 类可以使用 Car 类的公共 $name 属性和公共 __construct() 方法,这是由于继承机制。

但是,intro() 是一个抽象方法,应该在所有子类中定义,并返回一个字符串。

PHP - 更多抽象类实例

让我们看另一个例子,其中抽象方法有一个参数:

实例

<?php
abstract class ParentClass {
  // 带参数的抽象方法
  abstract protected function prefixName($name);
}

class ChildClass extends ParentClass {
  public function prefixName($name) {
    if ($name == "Bill Gates") {
      $prefix = "Mr.";
    } elseif ($name == "Jane Gates") {
      $prefix = "Mrs.";
    } else {
      $prefix = "";
    }
    return "{$prefix} {$name}";
  }
}

$class = new ChildClass;
echo $class->prefixName("Bill Gates");
echo "<br>";
echo $class->prefixName("Jane Gates");
?>
运行实例 »

点击 "运行实例" 按钮查看在线实例

让我们看另一个例子,其中抽象方法有一个参数,而子类有两个未在父类的抽象方法中定义的可选参数:

实例

<?php
abstract class ParentClass {
  // 带参数的抽象方法
  abstract protected function prefixName($name);
}

class ChildClass extends ParentClass {
  // 子类可以定义父类的抽象方法中不存在的可选参数
  public function prefixName($name, $separator = ".", $greet = "Dear") {
    if ($name == "Bill Gates") {
      $prefix = "Mr";
    } elseif ($name == "Jane Gates") {
      $prefix = "Mrs";
    } else {
      $prefix = "";
    }
    return "{$greet} {$prefix}{$separator} {$name}";
  }
}

$class = new ChildClass;
echo $class->prefixName("Bill Gates");
echo "<br>";
echo $class->prefixName("Jane Gates");
?>
运行实例 »

点击 "运行实例" 按钮查看在线实例

相关视频

更多

免费

php8,我来也
初级php8,我来也

34万次学习

收藏

免费

Thinkphp6.0正式版视频教程
中级Thinkphp6.0正式版视频教程

39.6万次学习

收藏

免费

细说PHP第一季
中级细说PHP第一季

31万次学习

收藏

精品课程

更多
前端入门_HTML5
前端入门_HTML5

共29课时

64.9万人学习

CSS视频教程-玉女心经版
CSS视频教程-玉女心经版

共25课时

41.2万人学习

JavaScript极速入门_玉女心经系列
JavaScript极速入门_玉女心经系列

共43课时

76.6万人学习

独孤九贱(1)_HTML5视频教程
独孤九贱(1)_HTML5视频教程

共25课时

64.1万人学习

独孤九贱(2)_CSS视频教程
独孤九贱(2)_CSS视频教程

共22课时

24.3万人学习

独孤九贱(3)_JavaScript视频教程
独孤九贱(3)_JavaScript视频教程

共28课时

36.2万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时

133.1万人学习

热门下载

更多
phpStudy 2018最新版
phpStudy 2018最新版

集成PHP7,16种组合,超全大合集

下载

VC9 32位
VC9 32位

VC9 32位 phpstudy集成安装环境运行库

下载

VC11 32位
VC11 32位

VC11 32位 phpstudy集成安装环境运行库​

下载

php程序员工具箱完整版
php程序员工具箱完整版

程序员工具箱 v1.0 php集成环境

下载

VC14 32位
VC14 32位

VC14 32位 phpstudy安装环境运行库

下载

SublimeText3汉化版
SublimeText3汉化版

中文版,非常好用

下载

Notepad++ Windows版
Notepad++ Windows版

Notepad++ 8.9.7 Windows版官方安装包,适合 Windows 用户进行代码编辑、文本处理、语法高亮和插件扩展配置。

下载