我刚刚学习PHP的接口,因为我以前从未真正使用过它们,但据我所知,它们只是一个接口,因为它们被称为,它们是如何维护实现的类的方式它们是结构化的吗?
例如,如果您想为两个不同的数据库创建两个不同的类,您可以这样做:
class mysql {
public function connect() {
// code here
}
public function getData() {
// code here
}
}
class mongoDB {
public function connect() {
// code here
}
public function getData() {
// code here
}
}
......这在技术上与以下相同:
interface database {
public function connect() {
}
public function getData() {
}
}
class mysql implements database {
public function connect() {
// code here
}
public function getData() {
// code here
}
}
class mongoDB implements database {
public function connect() {
// code here
}
public function getData() {
// code here
}
}
......我是对的?只是使用界面确保您不会像下面这样做,因此无法轻松更改数据库?
class mysql {
public function connect_mysql() {
// code here
}
public function getData() {
// code here
}
}
class mongoDB {
public function connect_mongo() {
// code here
}
public function getData() {
// code here
}
}
这几乎是他们背后的原因吗?
答案 0 :(得分:1)
接口的作用是标准化您的代码可以依赖的内容,同时将其与特定实现分离。哇,听起来很复杂。从接口的用户的角度来说,它更容易说明:
function (MyDatabaseInterface $db) {
$db->connect();
$db->getData();
}
类型提示是使用接口的重要部分。此函数声明其参数必须是MyDatabaseInterface
的实例,换句话说,implements MyDatabaseInterface
的任何对象。只要implements MyDatabaseInterface
,它完全取决于您的具体对象。因为在MyDatabaseInterface
中你已经指定了方法connect()
和getData()
,你可以确定传入的任何对象都有这些方法,你可以调用它们。
反过来说,看看这个功能:
/**
* @return MyDatabaseInterface
*/
function foo() {
...
}
此函数在内部执行的操作无关紧要,但它声明它将返回MyDatabaseInterface
类型的对象,换句话说,某些对象implements MyDatabaseInterface
。当你打电话时,你知道你可以依靠什么:
$bar = foo();
$bar->connect();
$bar->getData();
此函数可能会返回mysql
或mongoDB
的实例,这不是您关注的问题。你只需坚持界面中声明的内容,无论你得到什么具体的对象,你的代码都会有效。
界面字面定义代码之间的接口。它定义了代码可以安全地调用其他代码的方法,而无需将特定内容与特定类相关联。您的特定对象可以定义比接口中定义的方法更多的方法;接口不声明类结构。一个类可以同时实现多个接口,这意味着它实现了所有接口的所有方法;然后,每个单独的接口只表示可以在对象上调用的所有可能方法的子集。
您应该描述具体的"任务"或者"能力"这可以在界面中完成,而不是"类"。如果您的界面名称以" -able"结尾,如Iterable
,这是一个好兆头。然后,类可以实现多个接口,从而描述它可以做的所有事情"。然后,您可以要求具有特定"能力的函数参数"在特定点,如上面的示例代码所示。这使代码的各个部分彼此隔离和分离,这使您的代码更加灵活,可重用并适应变化。
对于一个有用的现实世界场景,想象一个正在开发大型项目的更大的开发团队。有几个子团队,每个子团队负责应用程序的不同部分。他们都坐在一起,提出了一个总体计划。在某些时候,这些独立团队的代码需要相互交互。他们可以预先定义这些接口:
他们可以定义在编写任何代码之前在接口中相互通信所需的不同方法,然后自行完成。他们可以依赖尚未编写的代码,因为他们已经决定了界面的外观。他们甚至可以暂时用真实的代码替换模拟对象,而Joe仍在敲打他的真实代码,然后只需将Joe随后提供的内容切换进去。即使您只是自己工作,所有这些技巧都很有用。