gpt4 book ai didi

Php,为什么 "global container"不好,如何避免?

转载 作者:行者123 更新时间:2023-12-02 11:08:10 25 4
gpt4 key购买 nike

给定一个类:

class Container
{
public function getServiceX()
{
create and return it
}

public function setServiceX ($obj)
{
}
}

它存储对象的实例。你可以把它看作一个工厂。实际行动:

public function addTitle()
{
Container::getServiceX()->doIt();
}

他们说它不好,因为它是“全局性的”。但对象可以改变,因此它满足 DI - 但会伤害 LoD。如果这很糟糕,那么好的解决方案是什么?如何确保一个类到达serviceX?

最佳答案

本质上,这是一个服务定位器或服务工厂。您甚至可以将其称为依赖项注入(inject)容器。这本身就很好。事实上这很棒。它的问题是你静态地调用它!您应该将依赖项注入(inject)容器注入(inject)到您的类中:

class Foo {

protected $container;

public function __construct(Container $container) {
$this->container = $container;
}

public function addTitle() {
$this->container->getServiceX()->doIt();
}

}

现在,您已经完全依赖注入(inject)并解耦了。

通过静态耦合调用,您仍然可能会遇到最初试图通过依赖注入(inject)容器避免的情况。如果您需要使用服务 X 注入(inject)一个类,并使用配置稍有不同的服务 X 实例注入(inject)第二个类,但您静态调用只能保存服务 X 的一份副本的同一个容器,该怎么办?您可以通过解耦对容器的静态调用并允许注入(inject)不同配置的容器来解决此问题。

关于Php,为什么 "global container"不好,如何避免?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32441201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com