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);