Laravel Singleton和Instance

时间:2014-04-19 09:10:35

标签: php laravel

在Laravel文档中,我读过:

将“共享”类型绑定到容器

App::singleton('foo', function()
{
    return new FooBar;
});

Vs以上。

将现有实例绑定到容器

$foo = new Foo;

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

由于Laravel文档的弱点,我无法理解它们的区别。

任何人都可以解释一下吗?

1 个答案:

答案 0 :(得分:7)

签入Github,我们可以看到the singleton methodbind方法的别名,但设置为“共享”(基本上是单身):

/**
 * 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);
}

另一方面,事实证明,the instance method有一个相当简单的用例:

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

基本上你传入一个现有的对象/值,而不是一个返回一个对象/值的Closure。它返回相同的对象/值实例,实际上也是单例。

不同之处在于,当一个实例在使用“实例”时绑定到容器时已存在,而它尚未创建(它是懒惰的,因此在需要之前可以节省可能昂贵的操作)通过“singleton”,当你通过时在一个闭包中,谁负责生成结果对象/值单例。