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

标签 php class laravel inversion-of-control

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

相关文章:

javascript - 滚动最新成员的个人资料

php - Laravel 中调用未定义函数 App\Http\Controllers\now()

java - 如何从另一个类更新JLabel的?

php - 如何使用 View 在 php 中回显当前 Laravel 版本的版本?

html - 渲染 HTML 标签 Laravel 5 Blade 模板

php - 您是否需要将 mysqli_real_escape_string 用于加密值?

php - 在mysql上使用关系表选择时生成自定义数组

php - 如何在 Linux 中启用核心 PHP 扩展?

c# - 满足条件时从列表中删除项目

PHP 动态类名 laravel