【发布时间】:2012-08-09 23:15:49
【问题描述】:
我一直在整个 PHP 应用程序中练习构造函数依赖注入。我不想在我的代码中乱扔对象创建,所以工厂来救援,或者至少我是这么认为的。
我开始用工厂连接组件,然后一些工厂开始使用其他工厂来获取依赖项,太好了,将所有创建代码保存在一个地方。但是,一旦工厂开始相互使用(或在下面的代码中,本身),我遇到了循环依赖问题,这根本无法解决。例如,我的 MapperFactory 使用自己将映射器与其他映射器注入(它们需要彼此构建完整的对象图“急切加载”):
class MapperFactory
{
public function create($type)
{
switch (true) {
case 'Item':
$mapper = new ItemMapper(
$this->create('Field')
);
break;
case 'Field':
$mapper = new ItemMapper(
$this->create('Item')
);
break;
default:
throw new Exception('Unknown mapper');
}
return $mapper;
}
}
$mf = new MapperFactory();
$mf->create('Item');
这是一个简化的示例,但随着应用程序的开发,这是一个越来越普遍的问题。从 PHP(安装了 xdebug)返回的错误是:
Fatal error: Maximum function nesting level of '100' reached, aborting!
完全理解 PHP 抱怨的原因(虽然 TBH 没看到)。
我的问题是,我是否完全忽略了工厂的意义?我是否正确使用工厂?看起来不是,但除了循环依赖(相当重要)之外,工厂是一种优雅的解决方案,可以将所有构造/连接逻辑隐藏在主应用程序之外。
【问题讨论】:
-
我认为这不是工厂的问题。首先,我没有得到“开关(真)”部分。那不应该是“switch ($type)”吗?其次,您的代码(如果我没看错的话)会无休止地递归。也许您应该只在准备好使用该实例变量时才创建子字段或子项。或者想出一些东西来结束递归。
-
我猜
switch (true) ...不是你要写的。但即使使用switch ($type),如果$type是Field或Item,你也会得到一个无限循环。
标签: php dependency-injection factory