繁体   English   中英

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

[英]When to use extends/abstract and implements/interface in PHP

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

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

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

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

谢谢!

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

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

所以基本上一个经验法则是:

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

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

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

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

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

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

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

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

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

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状态代码。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM