gpt4 book ai didi

php - Laravel:绑定(bind)到 IoC 容器

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:38:31 24 4
gpt4 key购买 nike

如果您将一个类绑定(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com