Laravel单例和实例化

4
在 Laravel 文档中,我阅读到:
将“共享”类型绑定到容器中
App::singleton('foo', function()
{
    return new FooBar;
});

对比

将现有实例绑定到容器中

$foo = new Foo;

App::instance('foo', $foo);

由于 Laravel 文档的不足,我无法理解它们之间的区别。有人可以解释一下吗?

1
在第二个例子中,如果我没有记错的话,您可以在将对象绑定到容器之前对其进行一些更改,即 $foo = new Foo; $foo->setBar(100); App::instance('foo', $foo) - Royal Bg
如果你的解释是正确的,我认为我明白了那里发生了什么。 - Mostafa Talebi
1个回答

10

查看Github,我们可以看到singleton方法bind方法的别名,但被设置为“shared”(基本上是一个单例):

/**
 * Register a shared binding in the container.
 *
 * @param  string               $abstract
 * @param  Closure|string|null  $concrete
 * @return void
 */
public function singleton($abstract, $concrete = null)
{
    return $this->bind($abstract, $concrete, true);
}

另一方面,实例方法其实有一个相当简单的用法:

/**
 * Register an existing instance as shared in the container.
 *
 * @param  string  $abstract
 * @param  mixed   $instance
 * @return void
 */
public function instance($abstract, $instance) { ... }

基本上,你传递的是一个已经存在的对象/值,而不是返回一个对象/值的闭包。它返回同一个对象/值实例,这实际上也是一个单例。

"instance" 绑定到容器时,实例已经存在,而使用 "singleton" 时,当你传递一个负责生成结果对象/值单例的闭包时,它尚未创建(它是惰性加载的,因此可以节省需要时的可能昂贵的操作)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接