PHP 抽象类

2025年04月17日 | 阅读 4 分钟

在 PHP 中,无法独立创建的类称为抽象类。这意味着抽象类不能直接用于创建对象。后续的类旨在扩展抽象类。通过概述继承类必须实现的常见方法和属性,它们充当其他类的模板。

"abstract" 关键字是 PHP 中的保留词之一。用 "abstract" 关键字指定的类不能被实例化,这意味着不能声明该类的新对象。另一个类可以扩展抽象类。

语法

定义抽象类的语法如下

构造抽象类对象

如前所述,不能声明此类的对象。因此,以下语句

它将触发如下所示的错误消息

输出

PHP Fatal error:  Uncaught Error: Cannot instantiate abstract class myclass

属性、常量和方法都可以存在于抽象类中。类的成员可以被分类为 private、public 或 protected。一个类也可以有一个或多个抽象方法。

如果一个类中的任何方法是抽象的,那么该类必须是抽象类。换句话说,不能在常规类中声明抽象方法。

这个例子将导致一个错误。

输出部分的错误消息将显示为

输出

PHP Fatal error:  Class myclass contains 1 abstract method and must therefore be declared abstract

抽象类可以被子类扩展并用作父类。然而,父类中的每个抽象方法都必须在子类中有一个具体的实现;否则,将发生错误

为什么要使用抽象类?

在 PHP 中,抽象类主要出于两个原因而必不可少

  • 代码重用:通过允许您在一个位置定义共享属性和方法,抽象类可帮助您减少代码重复。
  • 强制结构:它们通过要求子类实现某些方法来提供所有类之间统一的结构。

示例

在以下代码中,BaseClass 是一个抽象类,它声明了一个抽象方法 performAction()。一个名为 DerivedClass 的子类扩展了抽象类,但没有实现其父类的抽象方法。如果我们尝试实例化该子类,这将导致致命错误,因为它不满足抽象类的约定。

示例

立即执行

输出

给定的代码将导致致命错误,因为 DerivedClass 没有实现抽象类 BaseClass 中声明的抽象方法 performAction()。

Fatal error: Class DerivedClass contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (BaseClass::performAction) in [filename].php on line [line number]

要解决此错误,您必须在 DerivedClass 中实现 performAction() 方法。这是更正后的版本

已更正的代码

示例

立即执行

输出

Hello

另一个例子

在以下 PHP 脚本中,抽象类 Score 定义了一个抽象方法 calculatePercentage()。Score 类包含三个受保护的属性,表示各个学科的分数。Learner 类继承自 Score 并提供了抽象方法的具体实现。此方法根据三个分数计算平均百分比。

示例

立即执行

输出

Overall Percentage: 60

PHP 中抽象类和接口的区别

尽管 PHP 中的抽象类和接口具有相似的目的,都为其他类提供蓝图,但两者之间存在关键区别

抽象类Interface
使用 abstract 关键字定义。使用 interface 关键字定义。
不能直接实例化。不能直接实例化。
它可以包含常规(完全实现)和抽象(未实现)方法。只允许方法声明;不允许方法体。
扩展抽象类的类必须实现其所有抽象方法。实现接口的类必须定义其所有声明的方法。
可以定义具有任何可见性的属性:public、protected 或 private。接口不支持属性声明。

下一主题PHP 接口