我很难理解为什么以下代码无法正常工作。我通常使用bucket依赖注入器,但为了简化,我在下面使用了twittee,结果非常相似。
那么为什么我的修改后的Config
- 对象(以及创建的设置元素)不能用于MockObject
- 类?据我所知,它正确传递。
代码:
$c = new Container();
$c->config = function ($c) { return new Config(); };
$config = $c->config;
$config->setting = 'a value';
$c->MockObject = function ($c) { return new MockObject($c->config); };
$c->MockObject; // Error thrown: `Notice: Undefined index: setting`
课程:
class Container {
protected $s=array();
function __set($k, $c) { $this->s[$k]=$c; }
function __get($k) { return $this->s[$k]($this); }
}
class Config {
public $values = array();
function __set($key, $value){ $this->values[$key] = $value; }
function __get($key) { return $this->values[$key]; }
}
class MockObject {
function __construct(Config $config) { echo $config->setting; }
}
依赖注射容器由Fabien Potencier提供; https://github.com/fabpot/twittee
答案 0 :(得分:0)
我对PHP上的DI并不是非常熟悉,但我认为你的问题在于这一行:
$c->config = function ($c) { return new Config(); };
您的原始代码是
$config = $c->config = function ($c) { return new Config(); };
我猜测这会在$config->setting = 'a value'
上引发异常。 $config
和$c->config
都被定义为将返回新Config
对象的Closure。由于$config
是一个闭包,它永远不会有setting
属性。
您的更新代码是
$c->config = function ($c) { return new Config(); }; // $c->config is a closure as described
$config = $c->config; // $config is a new Config object
现在$config
被定义为Config
类,而不是Closure,因此$configure->setting
有效。
但是,$c->config
仍然引用Closure返回一个新的Config
对象。由于这个新的Config
对象没有名为“Setting”的属性,因此当您尝试检索它时会抛出错误。
我不确定它如何与您的其他设计相符,但以下内容应按预期工作:
$c->MockObject = function ($c) { return new MockObject($config); };