面向接口编程

面向接口编程并不是一种新的编程范式,这里的接口是狭义的接口,即 interface 关键字,它是抽象类的一种变体。广义的接口是任何一个可以对外提供服务的出口,如:提供数据传输的USB接口、支付宝开放平台的接口、微信公众平台的开放API等。下面我们要说的接口都是狭义的 interface 接口。

接口定义一套规范,它描述了一个“物”的基本功能。如果一个类(class)实现(implements)了某个接口(interface),我们便知道这个类实现了什么功能。

接口常用来作为类与类之间的一个协议、规范或者契约。接口是抽象类的变体,接口中所有的方法都是抽象方法(没有方法体),接口中除了可以包含方法外,还可以包含常量。

接口中定义的所有方法都必须是公有的,这是接口的特性。

接口应该对实现(implements)它的类起到强制规范和契约的作用,一个类一旦实现了某个接口,就必须实现接口中的所有方法,当然类还可以实现接口中没有的方法。

通常在大型项目中,会把代码进行分层和分工。核心开发人员和技术经理编写核心的流程和代码,往往是以接口的形式给出,而基础开发人员则针对这些接口,填充代码,实现具体的功能,如数据库操作。这样,核心技术人员就可以把更多的精力投入到技术攻关和业务逻辑中,后端基础开发人员则负责DAO和Service层的接口实现。这样就实现了代码的分工与协作。

接口本身并不提供实现,只是提供了一个规范。如果我们知道一个类实现了某个接口,就知道了可以调用接口的哪些方法。我们只需要知道这些就够了。

在PHP中,接口的语义是有限的,使用接口的地方并不多,PHP中的接口可以淡化为设计文档,起到一个团队开发基本契约的作用。

如定义一个缓存接口 cache_interface.php,代码如下:
由于PHP是弱类型语言,且强调灵活,所以并不推荐大规模使用接口,而是仅在部分“内核”代码中使用接口。因为PHP中的接口已经失去了很多接口应该具有的语义,从语义上考虑,可以更多地使用抽象类(abstract)。

接口与接口之间也可以继承,通过关键字  extends,一个子接口可以继承多个父接口,中间用逗号隔开。

一个类也可以实现多个接口,通过关键字 implements,中间用逗号隔开。从某种意义上来说,interface 和 trait 很像,它们都是对“多重继承”的一种变相实现。

接口作为一种规范和契约存在。作为规范,接口应该保证可用性;作为契约,接口应该保证可控性。

接口只是对功能的声明,一旦使用 interface 关键字,就应该有类来实现它。可以由程序员来实现(外部接口),也可以由系统来实现(内部接口)。接口本身什么都不做,但它可以告诉我们它能做什么。

PHP中的接口存在两个不足,一是没有契约限制,二是缺少足够多的内部接口。

接口其实很简单,它的各种应用也很灵活,设计模式中有很大一部分都是围绕接口展开的。

你可能感兴趣的:(接口,interface)