PHP中的接口是什么?
接口允许您创建定义实现它的类的方法的代码。 但是,您不能将任何代码添加到这些方法。
抽象类允许您执行相同的操作,并为该方法添加代码。
现在,如果你可以用抽象类实现相同的目标,为什么我们甚至需要接口的概念?
我被告知它与OO理论有关,从C ++到Java,这是PHP的OO东西的基础。 该概念在Java中有用,但不在PHP中? 这只是一种避免在抽象类中散布占位符的方法吗? 我错过了什么吗?
接口的整个目的是让你灵活地让你的类被迫实现多个接口,但仍然不允许多重继承。 从多个类继承的问题是多种多样的,维基百科的页面总结得非常好。
接口是一种妥协。 多重继承的大多数问题不适用于抽象基类,所以现在大多数现代语言禁用多重继承,但调用抽象基类接口并允许类“实现”尽可能多的那些。
这个概念在面向对象编程中非常有用。 对我来说,我认为一个界面就是合同。 只要我的班级和班级同意我们可以“接口”的方法签名合同。 至于抽象类,我将其看作更多的基类,将某些方法剔除,我需要填写详细信息。
如果已经有抽象类,为什么还需要一个接口? 防止多重继承(可能导致多个已知问题)。
其中一个问题是:
“钻石问题”(有时称为“致命的死亡钻石”)是当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()
。 想象一下,每个汽车品牌都会有与其他品牌不同的“方法”。 宝马将在右侧制动刹车,本田将在刹车盘左侧刹车。 人们必须了解这些“方法”如何在每次购买不同品牌汽车时都起作用。 这就是为什么在多个“地方”拥有相同的界面是一个好主意。
界面为你做了什么(为什么有人甚至会使用它)? 一个接口可以防止你制造“错误”(它可以确保所有实现特定接口的类都具有接口中的方法)。
// 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
类MongoPerson
。 我们如何使用方法的方式保持不变(界面保持不变)。
例如,它会像这样使用(在我们的代码中无处不在):
new MySqlPerson()->Create($personObject);
new MongoPerson()->Create($personObject);
这样,这样的事情就不会发生:
new MySqlPerson()->Create($personObject)
new MongoPerson()->Create($personsName, $personsAge);
记住一个界面并且使用同一个界面比多个不同界面更容易。
这样,对于不同的类, Create()
方法的内部可以不同,而不会影响调用此方法的“外部”代码。 所有外部代码必须知道Create()
方法有1个参数( $personObject
),因为外部代码将如何使用/调用方法。 外部代码不关心方法内部发生了什么; 它只需要知道如何使用/调用它。
你也可以在没有界面的情况下做到这一点,但是如果你使用界面,它更“安全”(因为它可以防止你犯错误)。 该接口向您保证, Create()
方法将在实现接口的所有类中具有相同的签名(相同类型和相同数量的参数)。 通过这种方式,您可以确定实现IPersonService
接口的任何类将拥有方法Create()
(在本例中),并且只需要1个参数( $personObject
)就可以调用/使用。
实现一个接口的类必须实现接口所具有的所有方法。
我希望我不要重复太多。
链接地址: http://www.djcxy.com/p/82109.html