什么时候在 PHP 中使用 Final?

2022-08-30 09:21:20

我知道 Final 类的定义是什么,但我想知道如何以及何时真正需要 final。

<?php
final class Foo extends Bar
{
   public function()
   {
     echo 'John Doe';
   }
}

如果我理解正确,“最终”使它能够扩展“Foo”。

任何人都可以解释何时以及为什么应该使用“最终”?换句话说,有什么理由不应该扩展一个类?

例如,如果类“Bar”和类“Foo”缺少某些功能,那么创建一个扩展“Bar”的类会很好。


答案 1

有一篇关于“何时宣布类最终”的好文章。引用其中的几句话:

TL;DR:如果你的类实现了一个接口,并且没有定义其他公共方法,那么它们总是最终

为什么我必须使用 ?final

  1. 防止大规模的厄运继承链
  2. 鼓励作文
  3. 强制开发人员考虑用户公共 API
  4. 强制开发人员收缩对象的公共 API
  5. 类始终可以变得可扩展final
  6. extends中断封装
  7. 您不需要这种灵活性
  8. 您可以自由更改代码

何时避免:final

最终类仅在以下假设下有效工作:

  1. 有一个抽象(接口),最终类实现
  2. 最终类的所有公共 API 都是该接口的一部分

如果缺少这两个前提条件中的一个,那么你可能会到达一个时间点,届时你将使类可扩展,因为你的代码并不真正依赖于抽象。

附言:感谢@ocramius的精彩阅读!


答案 2

对于一般用法,我建议不要做一个类。可能有一些用例是有意义的:如果您设计了一个复杂的API /框架,并希望确保框架的用户只能覆盖您希望他们控制的功能部分,那么限制这种可能性并创建某些基类可能是有意义的。finalfinal

例如,如果你有一个类,那么为了让你的框架形式的用户重写,比如说,你的类中的方法,这样做可能是有意义的。Integerfinaladd(...)


推荐