正如标题所说:什么是表明你应该使用和界面的关键点。什么是关键点,表明你应该不使用界面?
答案 0 :(得分:1)
接口是公共的"合同"无论何时您希望能够交换实现或让某人灵活地使用其他实现,您都应该使用接口。
示例:
您想存储一些内容,以便稍后加载。 你可以使用像
这样的东西public function save(MySQL $db, array $data);
但这不是很灵活,它将您的代码与MySQL实现联系起来。 如果你想为其他实现开放,因为你正在构建一个公共库或框架或其他什么,你应该做这样的事情。
public function save(Persistance $storage, array $data)
{
// dome some random stuff with you data
...
$storage->save($data);
}
在这种情况下,Persistence
是一个界面,它可能看起来像这样。
interface Persistance
{
public function save(array $data);
}
你本地实现可能看起来像这样。
class MySQL implements Persistance
{
public function save(array $data)
{
$this->insert('my_table', $data);
}
}
但是其他人可以将您的代码用于完整的不同持久层,例如Redis或Postgres,只需实现您的界面并注入自己的Persistence
实现。
这只是一个简单的例子,但接口主要是理解为类之间的契约,并使实现保持开放。
实现多个接口的机会很好但与多重继承无关。接口只能确保一个类有一些明确定义的输入和输出,但是在后台完成的工作是完全开放的。
如果你真的想进入多重继承'你应该看看Traits。
接口用于框架中,PHPFig最近定义了许多标准接口,以使框架组件更易于交换。
例如,PSR-16简单缓存接口可以在框架之间交换缓存层实现。
或者PSR-7请求响应接口使框架能够交换用于登录,CRF安全性或其他内容的标准化中间件实现。
依赖注入容器有一个PSR-11接口,如果框架将它们的实现从它们自己的DI容器改为接口,我们就可以使用那些具有不同DI容器实现的框架。
答案 1 :(得分:0)
接口的全部功能是让您可以灵活地让您的类实现多个接口,但仍然不允许多重继承。从多个类继承的问题是多种多样的。
接口是妥协。多重继承的大多数问题都不适用于抽象基类,所以现在大多数现代语言禁用多重继承,但是调用抽象基类接口并允许类实现"尽可能多的人。