【发布时间】:2011-12-03 03:53:55
【问题描述】:
好的,我正在尝试真正开始学习 PHP 中的 OOP 风格。我已经声明了接口和类,并让类实现了接口。然而,我想知道,是否不可能只将接口文件加载到 PHP 脚本文件中并从接口调用方法而不是加载类实现文件?如果是这样,那将如何做 b/c 我找不到答案。谢谢!
【问题讨论】:
好的,我正在尝试真正开始学习 PHP 中的 OOP 风格。我已经声明了接口和类,并让类实现了接口。然而,我想知道,是否不可能只将接口文件加载到 PHP 脚本文件中并从接口调用方法而不是加载类实现文件?如果是这样,那将如何做 b/c 我找不到答案。谢谢!
【问题讨论】:
接口可以没有实现,所以你不能这样做。他们的目的是规定类(实现接口)必须遵守的“合同”(即“实现此接口的类承诺提供公共方法 X Y 和 Z”)。
这真的是非常基本的 OOP 东西,它不仅仅适用于 PHP。我建议您在尝试进一步进步之前多学习一些 OOP 理论。
【讨论】:
您不能在接口上调用方法。无法实例化接口。您必须创建一个实现该接口的类并改用该类。
【讨论】:
提供了一个接口,因此您可以描述一组函数,然后将这些函数的最终实现隐藏在一个实现类中。这允许您在不改变使用方式的情况下更改这些功能的实现。
例如:我有一个数据库。我想编写一个访问数据库中数据的类。我定义了一个这样的接口:
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 类所做的。我们可以根据需要以多种不同的方式多次实现此接口。然后,我们可以在接口的实现之间切换,而不会影响我们的代码,因为接口定义了我们将如何使用它,而不管它实际上是如何工作的。
【讨论】: