我是依赖注入的忠实粉丝,但有些事情困扰着我,我想知道是否有人可以给我一个解释:
创建两个相互依赖的服务是不可能的,因为我们会得到一个“循环引用”异常。我认为使用 symfony2 的每个人都遇到过这个错误。
虽然我非常理解这个错误,但有时我会遇到它,因为有很多服务,带来了复杂性……而且,也许还因为设计/调整服务并不容易。
因此,我想知道此错误的根本原因:
IE:
class MyService1{
private $service2;
public function __construct(){ //empty constructor
...
}
protected function init(MyService2 $service2, ...){
$this->service2 = $service2;
}
}
class MyService2{
private $service1;
public function __construct(){ //empty constructor
...
}
protected function init(MyService1 $service1, ...){
$this->service1 = $service1;
}
}
Run Code Online (Sandbox Code Playgroud)
然后实例化这两个服务:
$service1 = new MyService1();
$service2 = new MyService2();
$service1->init($service2);
$service2->init($service1);
Run Code Online (Sandbox Code Playgroud)
我很确定有些东西我没有深入理解。那么有人可以解释一下为什么我们被阻止在容器中创建循环引用吗?
谢谢
我有一个特征,想输入提示 $this 来通知编译器它的类型:
trait MyTrait {
public function myAwesomeFunction() {
return new OtherClass($this); // warning: Expected MyAwesomeInterface, got MyTrait
}
}
class OtherClass {
public function __construct(MyAwesomeInterface $foo) { ... }
}
Run Code Online (Sandbox Code Playgroud)
所以我想知道是否有相当于的东西,例如:
trait MyTrait {
public function myAwesomeFunction() {
/**
* @var $this MyAwesomeInterface
*/
return new OtherClass($this); // no warnings
}
}
Run Code Online (Sandbox Code Playgroud)
这将使我能够通知编译器该特征的用户实现了我的接口。
请注意,特征无法在 PHP 中实现接口(请参阅为什么 PHP Trait 无法实现接口?)。
感谢您的任何帮助 ;-)