@yivi 首先在他们的回答中对循环引用的有效性做出了有效的观察。所以我真的认为你应该在这里评估你的设计。您可能正在治疗症状,而不是根本问题。尽管给出了您的通用示例代码(也就是说,这是解决手头问题的好代码),但我们不可能对此发表评论。如果您认为值得一试,也许可以对您的设计提出一个新问题?也许在这里或在Code Review上?
如果您控制 and 的设计ClassA
,ClassB
那么对这类事情的规定方法是使用 setter 注入,而不是构造函数注入。
这应该有效:
// PIMPLE CONTAINER
use Pimple\Container;
$container = new Container();
use Classes\ClassA;
$container['ClassA'] = function ($c) {
return new ClassA();
};
use Classes\ClassB;
$container['ClassB'] = function ($c) {
return new ClassB();
};
$container->extend('ClassA', function ($instanceOfA, $container) {
$instanceOfA->setB($container['ClassB']);
return $instanceOfA;
});
$container->extend('ClassB', function ($instanceOfB, $container) {
$instanceOfB->setA($container['ClassA']);
return $instanceOfB;
});
(未经测试,可能包含拼写错误,但这是一般要点)
请注意原始构造函数如何不再使用依赖项,将其插入留给特定的设置器。这允许您在容器中创建服务,然后使用extend
来调用相关的设置器以在此之后插入依赖项。
这在文档中:Modifying Services after Definition。