【问题标题】:Pass interface as the arguent to some function将接口作为参数传递给某个函数
【发布时间】:2015-03-18 17:10:30
【问题描述】:

我想知道。我在 Symfony2 TranslationLoader 类中找到了这个:

public function addLoader($format, LoaderInterface $loader)
{
    $this->loaders[$format] = $loader;
}

我发现LoaderInterface 只有一种方法。但是我们怎么知道这个接口的实现呢?这是接口注入?

【问题讨论】:

  • 如果您正在“注入”接口 - 那么您仅依赖于事实,即您的参数遵循合同,前提是该接口。接口的整个想法就是契约——你不应该知道具体的实现细节,甚至不知道那个实现是什么
  • @AlmaDo,所以如果我理解你的话,如果我的 SomeClass 会实现 LoaderInterface,然后我会调用 addLoader($format, SomeClass $loader) 就可以了?
  • 如果你有一个实现LoaderInterface的类,它必须包含接口声明的所有方法,在这种情况下只是public function load($resource, $locale, $domain = 'messages') (github.com/symfony/Translation/blob/master/Loader/…)。接口只是一个空类,它说明实现它的任何类中必须存在哪些方法。
  • @Qoop,我知道接口是什么,我不知道 TranslationLoader 类将如何知道 LoaderInterface $loader load() 方法背后隐藏的实现,但现在我认为它对我来说更清楚了。

标签: php symfony interface interface-injection


【解决方案1】:

接口注入is a thing,但实际上你在sn-p中看到的是Type Hintingstrong typing的一种形式。

这样做是在运行时强制传递给$loader 的值必须与类型提示中指定的接口(或类)的定义相匹配。基本上,这个问题的答案:

$loader 是否实现了LoaderInterface 的所有方法?

如果没有,您将收到catchable fatal error

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 2016-11-22
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    相关资源
    最近更新 更多