php - laravel 单例模式如何反射(reflect)后续调用的变化?

标签 php laravel dependency-injection

众所周知,单例概念对我们非常有用。但是一些基本概念让我摸不着头脑。

假设我们以下列方式将一个对象绑定(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/

相关文章:

php - Laravel 十进制列索引

php - 通过扩展类在其外部使用wordpress 4.0?

php - 表格未选取名字

laravel - 在 Laravel 项目中使用 Vuepress

java - Guice 单例是否支持线程限制?

java - Guice 设计模式 : Any advantages to requiring explicit bindings?

asp.net-core - 什么是 "DbContextOptions` 1"?

php - 如何在 Drupal 中为 Form API 按钮设置主题?

拉拉维尔 : Get permissions list for a user through roles table with belongtomany

php - 在 Laravel 中从数据库创建实体类