在Laravel文档中,我读过:
将“共享”类型绑定到容器
App::singleton('foo', function()
{
return new FooBar;
});
Vs以上。
将现有实例绑定到容器
$foo = new Foo;
App::instance('foo', $foo);
由于Laravel文档的弱点,我无法理解它们的区别。
任何人都可以解释一下吗?
答案 0 :(得分:7)
签入Github,我们可以看到the singleton
method是bind
方法的别名,但设置为“共享”(基本上是单身):
/**
* 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”,当你通过时在一个闭包中,谁负责生成结果对象/值单例。