Laravel 的 instance 绑定源码中,为什么要判断是否注册?

大家首先看看服务容器里面instance的绑定代码:

public function instance($abstract, $instance)
{
    $this->removeAbstractAlias($abstract);

    unset($this->aliases[$abstract]);        
    $this->instances[$abstract] = $instance;

    if ($this->bound($abstract)) {
        $this->rebound($abstract);
    }
}
public function bound($abstract)
{
    return isset($this->bindings[$abstract]) ||
           isset($this->instances[$abstract]) ||
           $this->isAlias($abstract);
}

很明显,instance函数中刚刚给instances赋值,然后就去利用bound函数去判断abstract是否被注册,这if条件百分之百为真啊,这个判断条件有啥用?

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5

因为bound这个方法是公共的,还有其他地方在调用,而且你自己也可以使用如下方式调用

$app->bound('xxxx');
6年前 评论

@CraryPrimitiveMan 我了解啊,但是在instance函数里面这个位置是不是有问题啊,前面刚刚给instances数组赋值,后面就用instances数组来判断是否注册过。所以要不然就没有if条件,要不然就放到instances数组赋值的前面判断,是不是呢?

6年前 评论

@leoyang 刚刚理解错了,从代码的是实现上来说确实没必要。难道是为了后续扩展?当bound方法做了调整时,instance可以不做调整?纯属瞎猜:smile:

6年前 评论

刚刚在github中和管理者交流了一下,的确是一个bug
@CraryPrimitiveMan

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!