PHP OOP:我做错了什么?

时间:2011-08-25 18:19:07

标签: php oop dependency-injection

我很难理解为什么以下代码无法正常工作。我通常使用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

1 个答案:

答案 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); };