App :: singleton和bindShared有什么区别?

Sco*_*nan 14 php singleton ioc-container laravel laravel-4

Laravel文档表明绑定单例的适当方法是使用该App::singleton()方法,但内部Laravel将使用该bindShared()方法(例如,in TranslationServiceProvider).

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

ric*_*ler 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);
}
Run Code Online (Sandbox Code Playgroud)

相似点:

  • 两种方法都bind()在引擎盖下.
  • 两种方法都传递true给第3个参数bind(),表示这是一个共享对象.
  • 在这两种情况下,因为这是一个共享对象,所以调用isShared($abstract)将返回true.
  • 在这两种情况下,因为这是一个共享对象,调用make($abstract)将返回第一个实例.

区别:

  • singleton()会接受一个Closure或一个string.bindShared()只接受一个Closure,而不是一个string.
  • bindShared()除了将对象作为共享对象绑定到IOC容器之外,还需要执行额外的步骤来将传递包装Closureshare'd中Closure,这样可以防止传递Closure多次执行.乍一看,这似乎是双重保证对象将被视为单身人士.我只能猜到为什么这可能是可取的.
  • bindShared()在框架内被调用了87次.singleton()被称为0次.

  • 看起来所有`bindShared()`调用都已在Laravel 5.0框架中更改为`singleton()`.这两种方法的实现似乎是一样的. (2认同)

Gra*_*ble 7

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

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

案例终于解决了:)