2010-11-13 61 views
6

可能重复:
What is the point of interfaces in PHP?我为什么要在PHP中创建接口?

我为什么要创建PHP接口?

据我所知,接口在那里描述实现它们的类。类必须至少包含这些函数。如果你正在构建别人的工作,或者必须保持一定程度的兼容性,这一切都很好。但是在更简单的情况下?

我知道,对于编译的编程语言,如C++,接口的使用可以提高编译速度,但PHP呢?这个好处似乎消失了,因为PHP被解释,而不是编译。

+0

我曾经这样想过,但实际上PHP被编译为字节码。当你执行脚本时,首先发生的事情是编译。这就是为什么你可以使用像APC这样的字节码缓存。 – JAL 2010-11-13 19:27:49

+0

接口用于代替多重继承。在PHP中,他们也可以在对象上提供一些语法特征,参见SPL类或ArrayAccces。 – mario 2010-11-13 19:30:35

+0

[PHP中的接口是什么?]的副本(http://stackoverflow.com/questions/20463/what-is-the-point-of-interfaces-in-php) – Gordon 2010-11-14 00:05:35

回答

1

也许现实世界的例子将有助于说明这一点。想象一下,您需要构建一系列记录类,将消息记录到各种媒体,如文本文件,XML或数据库。当然,每个类都需要有独立的代码来与不同类型的存储进行交互。但是,如果他们都实现相同的接口,那么他们向其他代码显示的“公共面孔”总是相同的。这样,使用日志对象的其他代码就不需要知道它们是什么类,它们是存储介质的实例还是什么。他们需要知道的一切就是所有的日志记录类,由于它们都实现了相同的接口,所以共享一个通用的API。这可能是一种非常强大的工作方式。您可以建立一个代码库,以不同的方式解决相关问题,只需在代码中“即插即用”即可。

+0

谢谢!这对我来说更加清晰。虽然其他答案包含很多额外的信息,但这让我感到困惑。 – 2010-11-13 20:27:23

1

接口是一种“模拟”多重继承的方式。 PHP中的类只能扩展一个父类,但可以实现任意数量的接口,从而允许创建具有多种不同类型的对象。

1

接口用于扩展/模拟核心PHP行为,如迭代器,数组访问等。这是接口给你的主要东西......也就是说,你不能以任何其他方式进行。

您还可以使用接口来执行参数检查:

function foo(MyInterface $obj) 
{ 
} 

虽然作为编译时检查,你会得到另一种语言而不是有用的(例如,C++),运行时检查仍然很有助于最大限度地减少错误。

最后,通过使用is_a函数或instanceof运算符,接口可以简化某些逻辑。你可以检查“抽象”对象是否实现了某个接口,然后做相应的处理。

+0

您的回答不正确。仿真/扩展核心PHP行为?接口用于在子类中实施标准API。如果正确实施,您可以切换出不同的类,并且不会有任何不兼容性。 – 2010-11-13 23:06:42

+0

要么你是无知的,或只是迂腐。例如,如果您希望您的对象通过'[]'数组语法来模拟(扩展,模仿,作为任何您喜欢的)数组,则必须实现ArrayAccess接口。没有其他办法可以做到这一点。还有许多其他内置接口提供了核心PHP功能。 – Matthew 2010-11-14 00:44:59

0

接口的使用与速度无关,永远不会。 但它与解耦和抽象有很大关系。

您将在PHP中使用它们:

  1. 隐藏实现 - 建立接入协议以一类对象的改变底层实现的,而不在所有你使用的对象
  2. 的地方重构要检查类型 - 为确保参数有一个特定类型的$object instanceof MyInterface
  3. 要强制参数在运行时检查 - 见@konforce回答
  4. 实现多个行为成一个类(构建复杂的类型)

    类汽车实现EngineInterface,BodyInterface,SteeringInterface {

使得Car对象CA现在start()stop()(EngineInterface)或goRight()goLeft()(转向接口)

和其他我现在无法想象的东西

来自Java中的思考:

一个接口说:“这就是所有实现这个特定接口的类都是这样的。”因此,任何使用特定接口的代码都知道可能为该接口调用哪些方法,就这些。所以这个接口被用来在类之间建立一个“协议”。

相关问题