Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP OOP:我做错了什么?_Php_Oop_Dependency Injection - Fatal编程技术网

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