PHP OOP:我做错了什么?
我很难理解为什么下面的代码不能按预期工作。我通常使用依赖注入,但为了简化,我在下面使用了依赖注入,得到了非常相同的结果 那么为什么我修改的PHP OOP:我做错了什么?,php,oop,dependency-injection,Php,Oop,Dependency Injection,我很难理解为什么下面的代码不能按预期工作。我通常使用依赖注入,但为了简化,我在下面使用了依赖注入,得到了非常相同的结果 那么为什么我修改的Config-对象(以及创建的设置元素)不能用于MockObject-类?据我所知,它的通过是正确的 代码: 课程: class Container { protected $s=array(); function __set($k, $c) { $this->s[$k]=$c; } function __get($k) { re
Config
-对象(以及创建的设置元素)不能用于MockObject
-类?据我所知,它的通过是正确的
代码:
课程:
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 Potentier提供 我对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
对象的闭包。因为$config
是一个闭包,所以它永远不会有设置
属性
您的更新代码是
$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
类,而不是闭包,因此$configure->setting
是有效的。
但是,$c->config
仍然指返回新的config
对象的闭包。因为这个新的Config
对象没有名为“Setting”的属性,所以当您试图检索它时,它会抛出一个错误
我不确定它是否适合您的其他设计,但以下内容应按预期工作:
$c->MockObject = function ($c) { return new MockObject($config); };
“我在下面使用了twittee,得到了非常相同的结果。”你得到了什么结果?注意:twittee的一个更强大的版本是Pimple:Fabien Povertier。是的,你知道的。只是用twitee来展示我在这里做什么
$c->MockObject = function ($c) { return new MockObject($config); };