【问题标题】:Using an interface and how to include it? [closed]使用接口以及如何包含它? [关闭]
【发布时间】:2013-06-13 22:12:38
【问题描述】:

我已经编程 PHP 半年了,我进入面向对象 3 个月。 但我从未使用过抽象类或Interface

我的一个伙伴解释了,但使用的是 Java:

如果你想给某个类一个结构,比如将一个接口实现为Entity,所有的底层类都必须继承接口的方法并给它一个body。

但我还是不明白,在 PHP 中。我找不到任何时间使用界面。

人们通常在什么时候发现接口有用?它们有用吗?或者我可以没有他们生活? 您能否向我展示一个使用界面的最佳时机的完美示例?

我已经阅读了文档,但也没有理解。

另一个问题:

如果我想对接口使用不同的文件,例如:

Body.interface.php

要在特定类中使用该接口,我必须使用include(),对吗?

【问题讨论】:

标签: php oop


【解决方案1】:

接口是针对您的班级的一组说明。实现接口时,继承类必须遵循接口定义的规则。

接口包括您继承的类必须具有的所有方法和属性、它们的参数、类型和任何 PHP 文档的列表。它们有两个关键目的:为扩展父类的开发人员提供一组说明,以及为扩展类提供一组规则。

一个很好的使用场景是,如果您创建的类将来会被其他类访问或扩展。就我而言,我在创建 API 时经常使用接口,例如 Restful 或 SOAP API。基类是具体的并包含一些重要的必需工具,因此该接口告诉我的其他开发人员他们如何与父类交互。

接口的有效使用

interface MyInterface {
    /**
     * This method is required in your inheriting class
     * @var \stdClass $MyRequiredParameter - A object of options
     */
    public function myRequiredMethod(stdClass $MyRequiredParameter);
}

class MyClass implements MyInterface {
    public function myRequiredMethod(\stdClass $MyRequiredParameter)
    {
        return $MyRequiredParameter->MyValue;
    }
}

class MyExtension extends MyClass implements MyInterface {
    public function myRequiredMethod(\stdClass $MyRequiredParameter)
    {
        return $MyRequiredParameter->MyOtherValue;
    }
}

接口类的无效扩展示例

class MyBadExtension implements MyInterface {
    public function weDontNeedNoStinkingRequiredMethods()
    {
        return FALSE;
    }
}

由于我们没有遵循接口的模式,所以我们生成了一个致命的异常:

Fatal error: Class MyBadExtension contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (MyInterface::myRequiredMethod)

【讨论】:

  • 那么基本上一个接口的点,是为一个类设置规则吗?所以我们只能使用一个名为 myRequiredMethod 的公共函数(根据您的示例)和 1 个参数,对吗?这只是班级的主体,就像我的伙伴解释的那样?
  • 接口方法总是必须是公开的。 Protected 和 Private 方法只能从类内部访问,因此不是“接口”。
【解决方案2】:
  • 界面与问题相同,创建界面时 用类实现然后类必须使用所有 接口方法。接口很短,意味着方法是 声明未定义。该类可以使用外部(自己的)方法。
  • 接口可以扩展
  • 所有方法都必须在接口中公开
  • 如果您是 Bose 并且想告诉您的客户,该界面很有用 要使用这种方法或各种类型的方法,只需 编写或创建接口,然后让您的客户在他们的 类

要在类中包含接口,您必须创建一个接口;

 interface interface_name{
        public function submodule1();
        public function submodule2();
}

现在在类中实现或应用它

class class_name implements interface_name{
public function submodule1()
{
//some code
}
public function submodule2()
{
//some code
}
}

【讨论】:

    【解决方案3】:

    接口旨在帮助您指定不适合类继承树但应该可以使用特定方法调用的行为。将其视为一种能力。

    如果你能数出一些东西,它就是可数的,你可以实现Countable 接口。其中一些东西也可以排序,它们是可排序的。您可以为此定义自己的接口并强制执行升序和降序排序的方法。

    接口没有任何方法的实现,您必须在实现类中这样做。

    您需要以与包含(抽象)类相同的方式包含接口。最简单的方法是使用自动加载器,让 php 在需要时加载类和接口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      • 2018-02-06
      相关资源
      最近更新 更多