如果您将一个类绑定(bind)到 IoC...
App::bind('Thing', function() {
return new \ThingOne;
});
然后,除非您调用 App::make('Thing')
,否则 ThingOne
对象永远不会被实例化。这是好事。
但是,如果您尝试覆盖该绑定(bind):
App::bind('Thing', function() {
return new \ThingOne;
});
App::bind('Thing', function() {
return new \ThingTwo;
});
App::bind('Thing', function() {
return new \ThingThree;
});
...然后 ThingTwo
对象和 ThingThree
对象将被实例化(并调用它们的构造函数),即使您从未调用过 App::make( '东西')
!那是一件坏事!为什么,以及如何防止这种情况发生?如果 IoC 不允许我们覆盖绑定(bind)以便我们可以扩展包等等,那么 IoC 有什么用? (这就是我想做的:将类绑定(bind)到我的包中的 IoC,然后在其他项目上实现这些包时可选择覆盖它们。)
顺便说一句,无论您使用 bind()
还是 singleton()
都会发生这种情况,没有任何区别。
非常感谢您的指导。
最佳答案
问题好像出在rebound
方法中的Illuminate\Container\Container
。该方法逻辑上仅在重新绑定(bind)时调用,因此不会第一次调用,但会在后续时间调用。您可以看到实例是为反弹回调做准备而创建的。
/**
* Fire the "rebound" callbacks for the given abstract type.
*
* @param string $abstract
* @return void
*/
protected function rebound($abstract)
{
$instance = $this->make($abstract);
foreach ($this->getReboundCallbacks($abstract) as $callback)
{
call_user_func($callback, $this, $instance);
}
}
FractalizeR 是正确的,在再次绑定(bind)之前调用 App::offsetUnset('Thing')
不会调用 __construct 方法。
关于php - Laravel:绑定(bind)到 IoC 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24397626/