关于oop:对于由单个开发人员构建的应用程序,php界面是多余的吗?

Is a php interface redundant for apps build by a single developer?

我的问题是:在PHP中,界面对于独立构建网站应用程序的开发人员真的有用吗?抽象类是否提供了接口提供的所有内容?

如果一个接口只是一个"契约",开发人员难道不知道类应该实现什么吗?

我能想到的唯一一个好处是一个类可以实现多个接口,但这又有多有用。当你知道一个类应该实现的所有东西时。你只是强迫自己实现这些方法。

如你所知,当我真正理解为什么一个接口是有用的时,我还在等待那一刻。

总结并简单说明:什么时候应该使用接口,为什么不使用抽象类?


仅仅因为你"知道"某个东西应该实现什么,并不意味着你记得它。这并不意味着你永远不会犯错误,也不会输入函数名。"编程中的契约"不仅仅是一个开发人员将事情强加给另一个开发人员——它们还让您为代码提供了一个刚性,使代码能够捕捉到可能在其他情况下被忽略的错误。


"编程到接口而不是实现"是GoF在其著作《设计模式:可重用面向对象软件的元素》中介绍的一个原则。

引用Erich Gamma关于Principe的话:

Once you depend on interfaces only, you're decoupled from the implementation. That means the implementation can vary, and that's a healthy dependency relationship. For example, for testing purposes you can replace a heavy database implementation with a lighter-weight mock implementation. […]

So this approach gives you flexibility, but it also separates the really valuable part, the design, from the implementation, which allows clients to be decoupled from the implementation. One question is whether you should always use a Java interfaces for that. An abstract class is good as well. In fact, an abstract class gives you more flexibility when it comes to evolution. You can add new behavior without breaking clients. […]

In Java when you add a new method to an interface, you break all your clients. When you have an abstract class, you can add a new method and provide a default implementation in it. All the clients will continue to work. As always there is a trade-off, an interface gives you freedom with regard to the base class, an abstract class gives you the freedom to add new methods later. It isn't always possible to define an interface in an abstract class, but in the light of evolution you should consider whether an abstract class is sufficient.

在这里阅读完整的采访

因此,可以使用接口或抽象类。你只需要考虑权衡。在我看来,使用界面是值得的,即使你是一个人。你很少知道你的应用最终会是什么样子。瀑布是一个神话,所以在开发过程中您必须面对变化,接口使您更容易接受它。

您可能还对以下方面感兴趣:

  • 在像PHP这样的弱类型语言中,接口的意义是什么?
  • 程序到接口,而不是PHP中的实现
  • 为什么使用动态/松散类型语言的接口?
  • PHP中接口的意义是什么?
  • 为什么在PHP中有一个没有返回类型的接口?

还有一些:

  • https://stackoverflow.com/search?Q=弱+类型化+接口+PHP


您可以使用接口

  • 函数public function foo(IWhatever $x)中的类型提示
  • 检查$x instanceof IWhatever
  • 在单元测试中创建模拟对象

当然,您也可以使用抽象类,但是如果您实际上不需要定义任何代码,那么使用接口可能是个更好的主意。


有一段时间,因为有人问过这个问题,但是界面的功能似乎让很多人困惑——如果你来这里看看,试着用500多张选票来举这个例子。我觉得这很有帮助。

"编程到接口"是什么意思?


在命令开发中,接口是非常好的实践。它创建了程序产品的完整性。第一次团队在抽象类之后编写接口(使用通用方法和抽象方法)。

抽象类在不同类中扩展它时很有用。例如,方法construct()对于所有子类都是通用的,但其他方法是不同的。

我们的团队使用这种模式:接口->摘要->Class1->Class2

1
2
3
Class1 extends Abstract implements Interface

Class2 extends Abstract implements Interface


When should I use interfaces and why
not use abstract classes instead ?

一旦使用工厂模式,应使用接口。我相信还有更多的例子。

看看各种各样的设计模式。http://www.ibm.com/developerworks/library/os-php-designptrn/

编辑:将链接更改为更好的解释。