何时在PHP中使用Final?

我知道Final课程的定义是什么,但是我想知道如何以及何时需要Final。

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

如果我理解正确的话,“最终”可以扩展“Foo”。

任何人都可以解释什么时候和为什么'最后'应该使用? 换句话说,为什么不应该延续一个阶级呢?

如果例如“Bar”类和“Foo”类缺less一些function,那么创build一个扩展“Bar”的类将会很不错。

对于一般用法,我build议不要做“最后”的课。 可能有一些使用情况是有意义的:如果你devise了一个复杂的API /框架,并且想要确保你的框架的用户只能覆盖你希望他们控制的function的一部分,那么你可能限制这种可能性,并使某些基类最终。

例如,如果你有一个“Integer”类,为了让你的框架表单的用户覆盖,比如说你的类中的“add(…)”方法,做这个最后的决定可能是有意义的。

有一篇关于“什么时候最终声明类”的好文章。 从它的几个引号:

TL; DR:如果你的类实现了一个接口,那么你的类永远是final的,而且没有其他的公有方法被定义

为什么我必须使用final

  1. 防止大规模的厄运inheritance链
  2. 鼓励构图
  3. 强迫开发人员考虑用户公共API
  4. 强制开发人员缩小对象的公共API
  5. final课程总是可以扩展的
  6. extends破解封装
  7. 你不需要这种灵活性
  8. 您可以自由更改代码

何时避免final

最终课程只有在以下假设下才能有效运作:

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

如果这两个先决条件中的一个缺失,那么当您将该类扩展时,您可能会达到某个时间点,因为您的代码不是真正依赖抽象。

PS感谢@ocramius伟大的阅读!

原因是:

  1. 宣布课程为最后阶段,防止课程被分类; 这是行的末尾。

  2. 将类中的每个方法声明为final允许创build可以访问父类的方法的子类,但不能覆盖它们。 子类可以定义自己的附加方法。

  3. 最终的关键字只能控制覆盖的能力,不应该与私有可见性修饰符混淆。 私有方法不能被任何其他类访问; 最后一个是可以的(PHPObjectOrientedSolutions Book第68页);

例如 :

 final childClassname extends ParentsClassname { // class definition omitted } 

这涵盖了整个class级,包括所有的方法和属性。 任何尝试从childClassname创build一个子类现在将导致一个致命的错误。 但是,如果您需要允许类被子类化,但是防止重写某个特定的方法,则最后的关键字会在方法定义之前。

 class childClassname extends parentClassname { protected $numPages; public function __construct($autor, $pages) { $this->_autor = $autor; $this->numPages = $pages; } final public function PageCount() { return $this->numPages; } } 

在这个例子中,他们都不能重写PageCount()方法。

最后一课是无法扩展的课程http://www.php.net/manual/en/language.oop5.final.php

您可以在类中包含您不希望重写的方法的地方使用它。 这可能是因为这样做会以某种方式破坏你的应用程序。