【问题标题】:Is this function a Service Locator/Container?这个功能是服务定位器/容器吗?
【发布时间】:2012-09-09 22:59:43
【问题描述】:
function app($key = null, $value = null)
{
    if (null !== $key && null !== $value) {
        $GLOBALS['__app'][$key] = $value;
    }

    return (object) $GLOBALS['__app'];
}

所以,我通常有一个这样的函数,我存储诸如 Request 和 Session 对象之类的东西,以便在我的应用程序的任何地方使用它们。例如:

app('req', new Request);

然后我像这样使用它:

app()->req->getMethod();

我的问题是,这到底是什么?此功能是否充当服务定位器和/或服务容器?我正在尝试记录我的代码,但无法解释此代码。

【问题讨论】:

  • 这是一个服务定位器、注册表等。它确实有全局状态,这很糟糕。

标签: php design-patterns


【解决方案1】:

它是一个服务容器,你可以在这里找到更多信息:

它比单例更好,因为你可以注入模拟对象,所以它更易于单元测试

【讨论】:

  • 服务容器?容器处理对象的生命周期。在这种情况下,没有生命周期等。这直接是服务定位器、注册表或表。你给它命名。
  • 您提供的链接将其称为服务容器和定位器,我不确定我是否理解其中的区别,如果有的话!
【解决方案2】:

它只是一个创建全局(应用程序)变量的哈希映射。它被转换成一个对象,因此您可以使用app()->req 而不是$map = app(); $value = $map['req'] 访问它的值

【讨论】:

  • 是什么让它成为服务定位器?
  • @DarthVader 我不确定,但这不是一张,它只是一张全球地图,你可以在其中放置任何东西。如果你愿意,你可以将它用作服务定位器,但如果是这样,它的设计就很糟糕,因为你可以用它来创建全局变量。
  • 但它是一个服务容器,那么呢?我不确定我是否理解 Container 和 Locator 之间的区别。
  • container DI containers 处理对象的创建、处置和生命周期。 locator 只是一个表,用来查找 objects 的 map。它对创建实例没有任何作用。
猜你喜欢
  • 2017-06-17
  • 2012-06-24
  • 2011-02-07
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多