PHP接口的意义是什么?

时间:2020-03-05 18:41:38  来源:igfitidea点击:

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

抽象类使我们可以做同样的事情,并向方法中添加代码。

现在,如果我们可以使用抽象类实现相同的目标,那么为什么我们甚至需要接口的概念?

有人告诉我,它与从C ++到Java的OO理论有关,这是PHP的OO东西所基于的。这个概念在Java中有用但在PHP中没有用吗?这只是一种避免在抽象类中乱扔占位符的方法吗?我想念什么吗?

解决方案

回答

该概念在面向对象的编程中非常有用。对我来说,我认为接口是一种合同。只要我的班级和班级就此方法签名合同达成共识,我们就可以"接口"。至于抽象类,我认为它们更多是一些某些方法的基类,因此我需要填写详细信息。

回答

接口本质上是我们可以创建的蓝图。它们定义了类必须具有的方法,但是我们可以在这些限制之外创建其他方法。

我不确定不能添加代码到方法是什么意思。我们是将接口应用于抽象类还是扩展它的类?

接口中应用于抽象类的方法将需要在该抽象类中实现。但是,将该接口应用于扩展类,则该方法仅需要在扩展类中实现。我在这里可能是错误的,因为我没有/应该/经常使用接口。

我一直认为接口是外部开发人员的模式,还是一种额外的规则集,可确保一切正确。

回答

接口的全部目的是使我们能够灵活地使类被强制实现多个接口,但仍不允许多重继承。从多个类继承的问题很多,而且也各不相同,其上的Wikipedia页面对此进行了很好的总结。

接口是一种折衷。多重继承的大多数问题都不适用于抽象基类,因此,当今大多数现代语言都禁用了多重继承,但调用了抽象基类的接口,并允许类"实现"所需的任意多个。

回答

在我看来,接口应该比非功能性抽象类更可取。如果仅实例化一个对象,而不是解析两个对象,将它们组合在一起,我什至不会感到惊讶,因为(仅实例化了一个对象,尽管我不确定,我对内部工作原理并不熟悉。 (OOP PHP)。

的确,与Java相比,接口没有那么有用/没有意义。另一方面,PHP6将引入更多类型提示,包括返回值的类型提示。这应该为PHP接口增加一些价值。

tl; dr:接口定义了需要遵循的方法列表(请考虑API),而抽象类则提供了一些基本/通用功能,子类可以根据特定需求进行细化。

回答

接口不仅用于确保开发人员实现某些方法。这样做的想法是,因为保证这些类具有某些方法,所以即使我们不知道类的实际类型,也可以使用这些方法。例子:

interface Readable {
  String read();
}

List<Readable> readables; // dunno what these actually are, but we know they have read();
for(Readable reader : readables)
  System.out.println(reader.read());

在许多情况下,提供或者不提供抽象的基类是没有意义的,因为实现方式千差万别,除了一些方法外,没有任何共同点。

动态类型的语言具有"鸭嘴式"的概念,在这种情况下,我们不需要接口。我们可以自由地假设该对象具有我们正在对其调用的方法。这可以解决静态类型的语言中的问题,在这种类型中,对象具有某种方法(在我的示例中为read()),但没有实现该接口。

回答

I can't remember if PHP is different in this respect, but in Java, you can implement multiple Interfaces, but you can't inherit multiple abstract classes. I'd assume PHP works the same way.

在PHP中,我们可以通过用逗号分隔多个接口来应用多个接口(我认为,我发现这种接口并不干净)。

至于多个抽象类,则可以有多个抽象相互扩展(再次,我对此不太确定,但我想我之前已经看到过)。我们唯一不能扩展的是最后一堂课。

回答

接口不会给代码带来任何性能上的提升或者类似的提升,但是它们在使代码可维护方面可以走很长的路要走。确实可以使用抽象类(甚至是非抽象类)来建立代码的接口,但是正确的接口(使用关键字定义的接口和仅包含方法签名的接口)更容易实现。整理并阅读。

话虽这么说,在决定是否在类上使用接口时,我倾向于谨慎使用。有时我想要默认的方法实现,或者所有子类都通用的变量。

当然,关于多接口实现的观点也很合理。如果我们具有实现多个接口的类,则可以在同一应用程序中将该类的对象用作不同类型。

但是,问题与PHP有关的事实使事情变得更加有趣。在PHP中,对接口的键入仍然不是非常必要的,在PHP中,无论类型如何,我们几乎都可以将任何内容提供给任何方法。我们可以静态地键入方法参数,但是其中一些参数是坏的(我相信字符串会引起一些麻烦)。再加上我们无法键入其他大多数引用这一事实,并且试图在PHP中强制进行静态键入(此时)没有太大价值。因此,在这一点上,PHP接口的价值远远不及更强类型的语言。它们具有可读性的优点,但几乎没有其他优点。多重实现甚至没有什么好处,因为我们仍然必须声明方法并将其提供给实现者。

回答

对于我来说,使用接口和抽象类之间的区别更多地与代码组织有关,而不是由语言本身来实施。在准备供其他开发人员使用的代码时,我经常使用它们,以使它们保持在预期的设计模式之内。接口是一种"按合同设计",即代码同意响应一组规定的API调用,这些API调用可能来自我们没有经验的代码。

虽然从抽象类继承是"是"关系,但这并不总是我们想要的,并且实现接口更像是"行为类似"关系。在某些情况下,这种差异可能非常显着。

例如,假设我们有一个抽象类Account,从中扩展了许多其他类(帐户类型等)。它具有一组仅适用于该类型组的特定方法。但是,这些帐户子类中的某些实现了Versionable,Listable或者Editable,以便可以将它们扔到希望使用这些API的控制器中。控制器不在乎它是什么类型的对象

相比之下,我还可以创建一个不从Account扩展的对象,例如User抽象类,并且仍然实现Listable和Editable,但不能实现Versionable,这在这里没有意义。

这样,我说的是FooUser子类不是一个帐户,但是它的行为就像一个Editable对象。同样,BarAccount从Account扩展,但不是User子类,而是实现Editable,Listable和Versionable。

将所有这些可编辑,可列出和可版本控制的API添加到抽象类本身中不仅会变得凌乱和丑陋,而且可能会复制Account和User中的通用接口,或者迫使我的User对象实现Versionable,可能只是抛出一个例外。