Php、工厂和容器对象相互需要,如何消除循环引用

Php、工厂和容器对象相互需要,如何消除循环引用,php,Php,此处工厂根据情况创建对象。它需要容器,因为某些分解对象需要来自此容器的对象。到目前为止一切正常,直到需要工厂的对象进入需要工厂的对象需要此工厂,因为它可能还需要工厂化其他对象。在这一点上,它看起来像一个循环引用问题。如何解开/解开这个 编辑:我想象我可以在以后注入它们: class Factory { /** * @var Container */ private $container; public function __construct(Con

此处
工厂
根据情况创建对象。它需要
容器
,因为某些分解对象需要来自此容器的对象。到目前为止一切正常,直到需要工厂的
对象进入<代码>需要工厂的对象
需要此工厂,因为它可能还需要工厂化其他对象。在这一点上,它看起来像一个循环引用问题。如何解开/解开这个

编辑:我想象我可以在以后注入它们:

class Factory
{
    /**
     * @var Container
     */
    private $container;

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

    public function createDate()
    {
        return new CustomDateClass(date(), $this->container->getDb());
    }
}

class Container
{
    /**
     * @var MySQL
     */
    private $db;

    /**
     * @return MySQL
     */
    public function getDb()
    {
        if ($this->db == null)
        {
             $this->db = new MySQL();
        }
        return $this->db;
    }

    /**
     * @return ObjectThatNeedFactory
     */
    public function getObjectThatNeedFactory()
    {
        if ($this->objectThatNeedFactory == null)
        {
             $this->objectThatNeedFactory = new ObjectThatNeedFactory($this->factory); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        }
        return $this->objectThatNeedFactory;
    }
}

$container = new Container();
$factory = new Factory($container);

但是它仍然很难闻

你应该研究依赖注入,而不是把工厂到处传。我真的不明白你需要一个工厂和一个容器做什么?他们似乎在做或多或少相同的事情?DI允许有一个实例,不是吗?现在,factory允许使用适当的容器创建多个时间,您可以定义是希望容器返回相同实例还是新实例,就像factory一样。查看一些现有的容器,如Pimple或Lightness容器(Laravel正在使用并使用反射进行自动依赖项解析/注入,这是我个人选择的容器)。无需重新发明轮子。但我仍然觉得工厂是一个用来创建对象的东西,容器是另一个用来保存这些对象的东西。任何具有$factory的对象都可以创建其具有的实例。但是$container不能传递给每个人,只有一些对象可以得到它拥有的对象。如果需要,容器会创建对象,如果它们被定义为单例,则存储它们以供重用。几乎所有的容器都是这样工作的。不需要工厂。谷歌搜索一些DI容器,阅读它们是如何工作的,它会变得清晰。将一个“通用”工厂传递给一堆不同的类感觉像是一种反模式。(最终,你会发现到处都是硬依赖关系)。
$container = new Container();
$factory = new Factory();
$container->injectFactory($factory);
$factory->injectContainer($container);