众所周知,单身人士的概念对我们非常有用。但是一些潜在的概念让我抓狂了。
说我们用以下方式将一个对象绑定为单例。
$this->app->singleton(Singleton::class, function () {
return new Singleton();
});
现在我们知道该对象只会被解析一次,然后它将被保存在容器的实例类属性中并以下列方式返回
if (isset($this->instances[$abstract]) && ! $needsContextualBuild) {
return $this->instances[$abstract];
}
好的,到目前为止一切正常。现在我们正在从控制器修改实例
function index(){
$abc = app(Singleton::class);
$abc->a = 'b;
}
我们正在访问其他功能的单身人士
function test(){
echo app(Singleton::class)->a;
}
当然我们可以看到它打印'b'。但实际上我们在索引函数中所做的是将单例保存到变量$ abc并且我们正在修改该变量,其中我假设从容器的单例数组中驻留单例对象的副本,因为laravel只是从其容器实例返回一个值索引匹配类名的数组。
但是当我们解析单个对象时,laravel如何管理它以反映下一个函数的变化,如上所述,只会影响$ abc变量。
我确信答案可能会让我发笑,因为我确信我错过了一些思考方式。