【问题标题】:Calling PHP interface methods调用 PHP 接口方法
【发布时间】:2011-12-03 03:53:55
【问题描述】:

好的,我正在尝试真正开始学习 PHP 中的 OOP 风格。我已经声明了接口和类,并让类实现了接口。然而,我想知道,是否不可能只将接口文件加载到 PHP 脚本文件中并从接口调用方法而不是加载类实现文件?如果是这样,那将如何做 b/c 我找不到答案。谢谢!

【问题讨论】:

    标签: php oop interface


    【解决方案1】:

    接口可以没有实现,所以你不能这样做。他们的目的是规定类(实现接口)必须遵守的“合同”(即“实现此接口的类承诺提供公共方法 X Y 和 Z”)。

    这真的是非常基本的 OOP 东西,它不仅仅适用于 PHP。我建议您在尝试进一步进步之前多学习一些 OOP 理论。

    【讨论】:

    • 谢谢!是的,我从一本书中读了一些东西后感到困惑,并认为这就是它告诉我要做的。哈哈,我已经习惯了程序化的做事方式。
    【解决方案2】:

    您不能在接口上调用方法。无法实例化接口。您必须创建一个实现该接口的类并改用该类。

    【讨论】:

      【解决方案3】:

      提供了一个接口,因此您可以描述一组函数,然后将这些函数的最终实现隐藏在一个实现类中。这允许您在不改变使用方式的情况下更改这些功能的实现。

      例如:我有一个数据库。我想编写一个访问数据库中数据的类。我定义了一个这样的接口:

      interface Database {
      function listOrders();
      function addOrder();
      function removeOrder();
      ...
      }
      

      然后假设我们开始使用 MySQL 数据库。所以我们写了一个类来访问 MySQL 数据库:

      class MySqlDatabase implements Database {
      function listOrders() {...
      }
      

      我们根据需要编写这些方法来获取 MySQL 数据库表。然后你可以编写你的控制器来使用这样的接口:

      $database = new MySqlDatabase();
      foreach ($database->listOrders() as $order) {
      

      假设我们决定迁移到 Oracle 数据库。我们可以编写另一个类来访问 Oracle 数据库:

      class OracleDatabase implements Database {
      public function listOrders() {...
      }
      

      然后 - 要将我们的应用程序切换为使用 Oracle 数据库而不是 MySQL 数据库,我们只需更改一行代码:

      $database = new OracleDatabase();
      

      所有其他代码行,例如:

      foreach ($database->listOrders() as $order) {
      

      将保持不变。关键是 - INTERFACE 描述了我们访问数据库所需的方法。它没有以任何方式描述我们如何实现这一目标。这就是 IMPLEMENTing 类所做的。我们可以根据需要以多种不同的方式多次实现此接口。然后,我们可以在接口的实现之间切换,而不会影响我们的代码,因为接口定义了我们将如何使用它,而不管它实际上是如何工作的。

      【讨论】:

        猜你喜欢
        • 2023-04-03
        • 2018-05-06
        • 1970-01-01
        • 2018-08-23
        • 1970-01-01
        • 2022-01-23
        • 2018-01-15
        • 1970-01-01
        • 2013-07-08
        相关资源
        最近更新 更多