Laravel 文档指出绑定(bind)单例的合适方法是使用 App::singleton()
方法,但 Laravel 内部将使用 bindShared()
方法(例如,在 TranslationServiceProvider
中)。
我假设记录的方法是首选,但是否存在功能差异?如果不是,是否有任何理由采用两种方法(可能超出历史偶然性)?
最佳答案
我一直在想同样的事情。我不知道这背后的动机,但我可以说出一些不同之处。
这是 Laravel 4.2 中对这两个方法的定义:
public function singleton($abstract, $concrete = null)
{
$this->bind($abstract, $concrete, true);
}
public function bindShared($abstract, Closure $closure)
{
$this->bind($abstract, $this->share($closure), true);
}
相似点:
- 这两种方法都在底层调用了
bind()
。 - 这两种方法都将
true
传递给bind()
的第三个参数,表示这是一个共享对象。 - 在这两种情况下,因为这是一个共享对象,所以调用
isShared($abstract)
将返回 true。 - 在这两种情况下,因为这是一个共享对象,所以调用
make($abstract)
将仅返回第一个实例。
区别:
singleton()
将接受一个Closure
或一个string
。bindShared()
将只接受一个Closure
,而不是一个string
。bindShared()
除了将对象作为共享对象绑定(bind)到 IOC 容器之外,还采取了附加步骤来包装传递的Closure
在share
的Closure
中,这可以防止传递的Closure
被多次执行。乍一看,这似乎是一个双重对象将被视为单例的保证。我只能猜测为什么这可能是可取的。bindShared()
在框架内被调用了 87 次。singleton()
被调用了 0 次。
关于php - App::singleton 和 bindShared 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23927215/