众所周知,单例概念对我们非常有用。但是一些基本概念让我摸不着头脑。
假设我们以下列方式将一个对象绑定(bind)为单例。
$this->app->singleton(Singleton::class, function () {
return new Singleton();
});
现在我们知道这个对象只会被解析一次,然后它会被保存在容器的实例类属性中,并以下面的方式返回
if (isset($this->instances[$abstract]) && ! $needsContextualBuild) {
return $this->instances[$abstract];
}
好的,到目前为止一切正常。现在我们正在从 Controller 修改实例
function index(){
$abc = app(Singleton::class);
$abc->a = 'b;
}
我们正在访问其他函数上的单例
function test(){
echo app(Singleton::class)->a;
}
当然我们可以看到它打印'b'。但实际上我们在 index 函数中所做的是将单例保存到变量 $abc 并且我们正在修改该变量,我想其中驻留了容器单例数组中单例对象的副本,因为 laravel 只是从其容器实例返回一个值索引与类名匹配的数组。
但是当我们解析单例对象时,laravel 如何管理它以反射(reflect)下一个函数的变化,如上变化仅影响 $abc 变量。
我确信这个答案会让我发笑,因为我确信我的思维方式中漏掉了一些东西。
最佳答案
不,对象实例是passed by reference .
app(Singleton::class)
不会创建副本,它总是返回(对)Singleton::class
的唯一实例。
关于php - laravel 单例模式如何反射(reflect)后续调用的变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49094200/