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

标签 php laravel laravel-4 singleton ioc-container

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 或一个 stringbindShared() 将只接受一个Closure,而不是一个string
  • bindShared() 除了将对象作为共享对象绑定(bind)到 IOC 容器之外,还采取了附加步骤来包装传递的ClosureshareClosure 中,这可以防止传递的 Closure 被多次执行。乍一看,这似乎是一个双重对象将被视为单例的保证。我只能猜测为什么这可能是可取的。
  • bindShared() 在框架内被调用了 87 次。 singleton() 被调用了 0 次。

关于php - App::singleton 和 bindShared 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23927215/

相关文章:

php - Redirect::route 在 Laravel 5 的 URL 中带有参数

php - 无法在 Laravel 4.2 中创建数据库表

PHP 无限循环在 60 秒后未终止

php - Yii:在新窗口中打开网址,而不是在新选项卡中

php - Laravel 5.3 ModelFactory Seeder 调用未定义的方法 Illuminate\Database\Query\Builder::posts()

installation - Laravel 4 中的 session ID 太长或包含非法字符

view - Laravel View 无法调用子文件夹 View

php - 交响乐2 : Translate to default locale

php - 多个账户的捐款总和(变量)

Laravel 4 : Unable to generate a URL for the named route "login" as such route does not exist