laravel singleton模式mange如何反映后续调用的变化?

问题描述 投票:5回答:1

众所周知,单身概念对我们非常有用。但是一些潜在的概念让我头疼。

假设我们以下列方式将一个对象绑定为单例。

$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变量。

我相信答案会让我发笑,因为我确信我已经错过了一些思考方式。

php laravel dependency-injection
1个回答
2
投票

不,对象实例是passed by reference

app(Singleton::class)不会创建副本,它总是返回(引用)Singleton::class的唯一实例。

© www.soinside.com 2019 - 2024. All rights reserved.