【问题标题】:Why should I create Interfaces in PHP? [duplicate]为什么要在 PHP 中创建接口? [复制]
【发布时间】:2011-05-09 14:57:53
【问题描述】:

可能重复:
What is the point of interfaces in PHP?

为什么要在 PHP 中创建接口?

据我了解,接口用于描述实现它们的类。这些类必须至少包含这些功能。如果您在其他人的工作基础上构建,或者必须保持一定程度的兼容性,这一切都很好。但在更简单的情况下呢?

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

【问题讨论】:

  • 我以前也是这么想的,其实PHP是编译成字节码的。执行脚本时,首先发生的是编译。这就是为什么你可以使用像 APC 这样的字节码缓存。
  • 使用接口代替多重继承。特别是在 PHP 中,它们还可以在对象上提供一些语法特性,请参阅 SPL 类或 ArrayAccces。

标签: php


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢!这让我更清楚了。尽管其他答案包含很多附加信息,但这让我感到困惑。
    【解决方案3】:

    接口用于扩展/模拟核心 PHP 行为,如迭代器、数组访问等。这是接口为您提供的主要功能……也就是说,您不能以任何其他方式做到这一点。

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

    function foo(MyInterface $obj)
    {
    }
    

    虽然不如在其他语言(例如 C++)中获得的编译时检查有用,但运行时检查在最大限度地减少错误方面仍然非常有用。

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

    【讨论】:

    • 你的答案不正确。模拟/扩展核心 PHP 行为 ???接口用于在子类之间强制执行标准 API。如果实施正确,您可以切换出不同的类并且不会有任何不兼容性。
    • 要么你是无知的,要么只是学究气。例如,如果您希望您的对象通过 [] 数组语法模拟(扩展、模仿、充当任何您喜欢的)数组,则必须实现 ArrayAccess 接口。没有其他方法可以做到这一点。还有许多其他内置接口提供了核心 PHP 功能的挂钩。
    【解决方案4】:

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

    您将在 PHP 中使用它们:

    1. 要隐藏实现 - 建立一个对象类的访问协议,更改底层实现,而无需在您使用该对象的所有地方进行重构
    2. 检查类型 - 如确保参数具有特定类型 $object instanceof MyInterface
    3. 在运行时强制执行参数检查 - 请参阅 @konforce 答案
    4. 在一个类中实现多种行为(构建复杂类型)

      类 Car 实现 EngineInterface、BodyInterface、SteeringInterface {

    所以Car 对象现在可以start()stop()(引擎接口)或goRight()goLeft()(转向接口)

    还有其他我现在想不起来的事情

    来自 Java 的思考:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-14
      • 2012-03-16
      • 1970-01-01
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多