Я не очень хорошо знаком с DI на PHP, но я думаю, что ваша проблема в этой строке:
$c->config = function ($c) { return new Config(); };
Ваш оригинальный код был
$config = $c->config = function ($c) { return new Config(); };
Полагаю, это исключение на $config->setting = 'a value'
. $config
и $c->config
оба были определены как Замыкание, которое возвратило бы новый объект Config
. Поскольку $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
, а не как Замыкание, поэтому $configure->setting
допустим.
Тем не менее, $c->config
все еще ссылается на Closure, возвращающий новый Config
объект. Поскольку этот новый Config
объект не имеет свойства с именем «Setting», он выдает ошибку, когда вы пытаетесь получить его.
Я не уверен, как он вписывается в остальную часть вашего дизайна, но следующее должно работать, как и ожидалось:
$c->MockObject = function ($c) { return new MockObject($config); };