PHP Final 关键字

2025 年 4 月 29 日 | 阅读 3 分钟

PHP 中的 Final 关键字仅适用于类和类的方法。因此,如果我们声明一个类方法为 Final,那么该方法就不能被子类覆盖。与方法类似,如果我们声明一个类为 Final,那么该类就不能再被继承。

如何使用 Final 关键字?

Final 关键字有两种使用方式:

  • 类:这会阻止类被继承或扩展。
  • 方法:这会阻止子类覆盖它们。

在类中使用 Final 关键字

当一个类使用 final 关键字定义时,意味着该类不能被扩展或继承。这对于您希望限制类不被覆盖或更改的情况很有用。

示例:尝试继承 Final 类

示例

立即执行

输出

Fatal error: Class SubClass may not inherit from final class (MainClass) in /box/script.php on line 18

说明

在上面的代码中,我们可以看到继承一个用 final 关键字定义的父类会导致一个致命错误

在方法中使用 Final 关键字

PHP中,在方法前加上 final 关键字意味着该方法不能在任何子类中被覆盖,尽管类本身仍然可以被扩展。

示例:防止方法覆盖

示例

立即执行

输出

Fatal error: Cannot override final method BaseClass::calculate() in /box/script.php on line 11

说明

在上面的示例中,我们有一个名为 BaseClass 的父类,其中包含一个被标记为 final 的 calculate() 方法。这表明该方法不能在任何子类中被覆盖。

然而,ChildClass 试图覆盖 BaseClass 的 calculate() 方法。由于 PHP 不支持覆盖 final 方法,这会在运行时导致致命错误。

这种行为施加了严格的继承约束,并确保某些关键方法(例如这里的 calculate())不会被派生类修改,这对于维护核心应用程序构建块中的逻辑尤其有价值。

在常量中使用 Final 关键字(PHP 8.1+)

从 PHP 8.1 开始,您可以将常量声明为 final。如果子类尝试覆盖该常量,则会抛出错误。

示例:Final 常量继承限制

示例

立即执行

输出

Fatal error: CustomSettings::VERSION cannot override final constant AppSettings::VERSION in /tmp/2VNdnk3wSF/main.php on line 7

说明

在提供的 PHP 代码中,AppSettings类使用 final 关键字声明了一个 VERSION 常量,这意味着该常量不能在任何子类中被覆盖。final 关键字确保一旦常量声明,它就不会在继承层次结构中的任何地方被更改。

在这种情况下,CustomSettings 类尝试通过声明一个具有相同名称但值不同的新常量来覆盖 VERSION 常量。但是,由于 VERSION 在父类中被设为 final,这会导致致命错误。PHP 版本 8.1.0 中的这一新功能用于保持一致性并避免关键值在子类中被无意更改。


下一主题PHP 类型提示