何时在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
?
- 防止大规模的厄运inheritance链
- 鼓励构图
- 强迫开发人员考虑用户公共API
- 强制开发人员缩小对象的公共API
final
课程总是可以扩展的extends
破解封装- 你不需要这种灵活性
- 您可以自由更改代码
何时避免
final
:最终课程只有在以下假设下才能有效运作:
- 有一个最终类实现的抽象(接口)
- 最终类的所有公共API都是该接口的一部分
如果这两个先决条件中的一个缺失,那么当您将该类扩展时,您可能会达到某个时间点,因为您的代码不是真正依赖抽象。
PS感谢@ocramius伟大的阅读!
原因是:
-
宣布课程为最后阶段,防止课程被分类; 这是行的末尾。
-
将类中的每个方法声明为final允许创build可以访问父类的方法的子类,但不能覆盖它们。 子类可以定义自己的附加方法。
-
最终的关键字只能控制覆盖的能力,不应该与私有可见性修饰符混淆。 私有方法不能被任何其他类访问; 最后一个是可以的(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
您可以在类中包含您不希望重写的方法的地方使用它。 这可能是因为这样做会以某种方式破坏你的应用程序。