何时在PHP中使用extends / abstract和implements / interface

时间:2012-02-14 09:44:59

标签: php oop interface abstract-class

所以,我开始在PHP中强调抽象接口的概念。
但什么时候真有用呢?

当然,我可以使用界面来构建我的类的规则,因此它们都遵循特定的模式。 但它什么时候真有用?

为什么我要创建一个抽象类,而不是只创建一个由它自己工作的类,但对其他类有用。
摘要我或许可以把头放在一边看看好用,例如通过制作一般课程。就像创建一个抽象的Database类,然后将它扩展到Mysql-和MsAccess数据库类。赋予两种类似的功能,在两种情况下都可以实现无缝体验。

但实际上,有人能给我一个更好的例子,说明抽象界面 真的有用吗?
请注意,我知道它是如何工作的,或者如何编写代码,而不是如何或何时使用它。

谢谢!

4 个答案:

答案 0 :(得分:7)

摘要表示“这里是您的课程的模式,以及一些可以让您失望的代码”。抽象类的设计者可以将某些方法标记为需要由扩展类(abstract)或final提供,这意味着类不能覆盖它们。

界面表示“这是您班级的模式,但您必须自己编写所有代码”。接口中声明的任何方法和属性必须由实现接口的类提供。

基本上,经验法则是:

  

如果您拥有可以或必须由子类使用的代码,则需要一个抽象类。如果只有方法和属性声明,则可以使用接口。

不要忘记,使用抽象类会在某种程度上限制您,因为后代类只能扩展一个类,而它可以实现任意数量的接口。

答案 1 :(得分:6)

接口不是类,而抽象类已经是类。

由于每个类都有一个接口(根据定义),interface允许您为任何类指定接口 next ,无论是否抽象。

对接口进行编程然后允许您将另一个类替换为,而保持相同的接口。因此它使您的代码更少耦合。它不再针对具体类进行编程,而是“仅针对更轻量级的接口”。如果您不想针对具体的类名而不是针对类型进行编程,那么接口就非常有用。您可以将对象替换为实现相同接口的任何其他对象。

另一方面,抽象类 - 甚至称为抽象类 - 非常具体。但是,它不是最终的,所以它形成了一个类的模式,就像规范如何从一个类扩展它应该为某个功能编写。因为它是抽象的,它不能在没有延伸的情况下生存。抽象类用于创建基类,其代码将被多次使用以减少代码重复并且无法直接实例化。

答案 2 :(得分:2)

界面就像合同一样。如果一个类实现了一个接口,那么使用该类的其他代码现在知道它支持某些特性。

PHP中接口的最佳示例是Iterator接口。

接口的好处是类可以实现多个。 '扩展'不允许这样做。这意味着子类可以实现一个接口,但它的父级不必。

阅读设计模式。很多这个你会发现,你永远不会怀疑它在哪些情况下是有道理的。 “首先设计模式”我认为是一本好书,写得非常好。尽管他们在他们的示例中使用了Java,但大多数东西都非常适用于PHP。

我还有一个现实生活场景。

我们的应用程序总是在发生错误时随处抛出异常。每种类型的异常都会获得自定义类。一个例子是RecordNotFound异常。

如果未捕获异常,则会有一个顶级异常块,看起来有点像这样:

try {

 // Do everything in the app!

} catch (Exception $e) {

  // draw a good error page

}

在某些情况下,需要将异常映射到某些HTTP状态代码,例如404(未找到)。因此我们有这个界面:

interface HTTPException {

  function getHTTPCode();

}

任何异常,无论继承树现在有多深,都可以实现此接口并发出特定的HTTP状态代码。

我甚至创建了接口,没有任何方法。我会留给你试着想出一个可能有意义的理由。

答案 3 :(得分:2)

接口只是类的骨架结构,而不是类。我们可以实现该类并添加一些额外的功能以使其更加清晰。 implements 关键字可用于接口。通常,在接口中使用工具来实现这些功能。

abstract 是一个隐藏某些功能的类,只显示必要的功能。 扩展关键字可用于抽象类。一般来说,extends可以用来扩展抽象类的特性。