首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP中接口的意义是什么?

PHP中接口的意义是什么?
EN

Stack Overflow用户
提问于 2008-08-21 16:35:21
回答 15查看 99.6K关注 0票数 241

Interfaces允许您创建代码来定义实现它的类的方法。但是,您不能向这些方法添加任何代码。

Abstract classes允许您做同样的事情,并向方法中添加代码。

现在,如果你可以用抽象类实现同样的目标,为什么我们还需要接口的概念呢?

有人告诉我,这与从C++到Java的面向对象理论有关,而这正是PHP的基础。这个概念在Java中有用,但在PHP中没有用吗?这只是一种避免在抽象类中丢弃占位符的方法吗?我是不是遗漏了什么?

EN

回答 15

Stack Overflow用户

回答已采纳

发布于 2008-08-21 16:45:54

接口的全部要点是为您提供灵活性,让您的类被强制实现多个接口,但仍然不允许多重继承。从多个类继承的问题多种多样,上面的wikipedia页面很好地总结了这些问题。

接口是一种折衷方案。多重继承的大多数问题不适用于抽象基类,因此现在大多数现代语言禁用多重继承,但仍调用抽象基类接口,并允许类根据需要“实现”任意多个接口。

票数 148
EN

Stack Overflow用户

发布于 2008-08-21 16:39:23

这个概念在面向对象编程中非常有用。对我来说,我把接口看作是一种契约。只要我的类和你的类在这个方法签名契约上达成一致,我们就可以“接口”。至于抽象类,我认为它们更多的是基类,它们存根出了一些方法,我需要填写细节。

票数 128
EN

Stack Overflow用户

发布于 2014-06-27 01:11:41

如果已经有抽象类了,为什么还需要接口呢?用来防止多重继承(可以导致多个已知问题)。

其中一个问题是:

“钻石问题”(有时被称为“致命的死亡钻石”)是当两个类B和C从A继承,而类D从B和C继承时出现的歧义。如果A中有一个方法被B和C重写,并且D没有重写它,那么D继承的是方法的哪个版本:B的版本,还是C的版本?

来源:https://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem

为什么/什么时候使用接口?一个例子...世界上所有的汽车都有相同的接口(方法)...AccelerationPedalIsOnTheRight()BrakePedalISOnTheLeft().想象一下,每个汽车品牌都有不同于其他品牌的这些“方法”。宝马的刹车在右侧,本田的刹车在车轮的左侧。每次购买不同品牌的汽车时,人们都必须学习这些“方法”是如何工作的。这就是为什么在多个“地方”拥有相同的界面是一个好主意。

界面能为你做什么(为什么有人会用它)?接口可以防止您犯“错误”(它向您保证,实现特定接口的所有类都将具有该接口中的方法)。

代码语言:javascript
复制
// Methods inside this interface must be implemented in all classes which implement this interface.
interface IPersonService
{   
    public function Create($personObject);
}

class MySqlPerson implements IPersonService
{
    public function Create($personObject)
    {
        // Create a new person in MySql database.
    }
}

class MongoPerson implements IPersonService
{
    public function Create($personObject)
    {
        // Mongo database creates a new person differently then MySQL does. But the code outside of this method doesn't care how a person will be added to the database, all it has to know is that the method Create() has 1 parameter (the person object).
    }
}

这样,Create()方法将始终以相同的方式使用。无论我们使用的是MySqlPerson类还是MongoPerson类,都没有关系。我们使用方法的方式保持不变(接口保持不变)。

例如,它将像这样使用(在我们的代码中的任何地方):

代码语言:javascript
复制
new MySqlPerson()->Create($personObject);
new MongoPerson()->Create($personObject);

这样,就不会发生这样的事情:

代码语言:javascript
复制
new MySqlPerson()->Create($personObject)
new MongoPerson()->Create($personsName, $personsAge);

记住一个界面并在任何地方使用相同的界面要比记住多个不同的界面容易得多。

这样,对于不同的类,Create()方法的内部可以是不同的,而不会影响调用此方法的“外部”代码。所有外部代码必须知道的是,方法Create()有一个参数($personObject),因为这是外部代码使用/调用该方法的方式。外部代码并不关心方法内部发生了什么;它只需要知道如何使用/调用它。

你也可以在没有接口的情况下做到这一点,但如果你使用接口,它会“更安全”(因为它可以防止你犯错误)。该接口确保方法Create()在实现该接口的所有类中都具有相同的签名(相同的类型和相同数量的参数)。这样,您就可以确保实现IPersonService接口的任何类都将拥有方法Create() (在本例中),并且只需要一个参数($personObject)就可以调用/使用。

实现接口的类必须实现接口所执行/拥有的所有方法。

我希望我没有重复太多。

票数 80
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档