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

标签 php

给定一个类:

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/

相关文章:

php - 指定 PHP 版本的 Composer 依赖

javascript - 动态填充图像 slider

javascript - 将 html 表单数据发布到 php 并通过 javascript 访问该数据

php - Magento 补丁 6788 安装错误

php - 哪个 XML-RPC 库?

javascript - PHP DOM 操作有什么用?

php - 如何设置这个 php soap header?

php - Drupal 7 数据库插入对某些用户不起作用

php - HTML PHP 添加数量和价格到我的菜单项

php - 如何将行回显到我的 html 中?