App :: singleton和bindShared之间的区别是什么?

时间:2014-05-29 06:37:32

标签: php laravel laravel-4 singleton ioc-container

Laravel文档指出绑定单例的适当方法是使用App::singleton()方法,但内部Laravel将使用bindShared()方法(例如,在TranslationServiceProvider中)。< / p>

我认为记录的方法是首选,但是有功能差异吗?如果没有,是否有任何理由采取两种方法(超出历史意外)?

4 个答案:

答案 0 :(得分:8)

我一直想知道同样的事情。我不知道这背后的动机,但我可以谈一些差异。

以下是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()将接受ClosurestringbindShared()只接受Closure,而不是string
  • bindShared(),除了将对象作为共享对象绑定到IOC容器之外,还需要附加步骤将Closure包裹在share中}'d Closure,可防止传递的Closure被多次执行。乍一看,这似乎是 double 保证对象将被视为单身。我只能猜到为什么这可能是可取的。
  • bindShared()在框架内被调用了87次。 singleton()被称为0次。

答案 1 :(得分:7)

除了bindShared()只接受闭包之外,它们在功能上是相同的。

因此,Laravel 5.1(PR 9009 - commit 829060f)已弃用bindShared(),并在Laravel 5.2(PR 9037)中将其删除。

案件终于解决了:)

答案 2 :(得分:2)

bind($ abstract,$ concrete,$ shared) 添加$ abstract作为容器的键,$ concrete是在其位置实例化的具体类。主要用于为接口提供具体实现。

<强>共享($闭合) 给定一个闭包(仅限),使其表现得好像是共享的(实例/单例样式),然后返回它。技术上等同于App :: bind($ key,$ closure,true),但是以不同的方式进行。主要用于服务提供商,为IoC容器添加完全可解析的服务。

bindShared($ abstract,$ closure) 4.1中引入的快捷方式,适用于常见模式。基本上帮助那些想要在容器中绑定共享实例的人。例如,见下文。

单身($ abstract,$ concrete) 只需一个别名来绑定$ shared参数设置为true。主要用于为接口提供具体实现,但应该只有一个实例(数据库连接等)。“

这是来自http://alexrussell.me.uk/laravel-cheat-sheet/我认为这个链接应该是有帮助的

答案 3 :(得分:0)

我认为主要是为了向后兼容。 Singleton解释了比bindShared更好的行为。删除bindShared意味着Package开发人员重构他们的代码。