Php 什么';应用程序::singleton和bindShared之间的区别是什么?

Php 什么';应用程序::singleton和bindShared之间的区别是什么?,php,laravel,laravel-4,singleton,ioc-container,Php,Laravel,Laravel 4,Singleton,Ioc Container,Laravel文档指出绑定singleton的合适方法是使用App::singleton()方法,但在内部,Laravel将使用bindShared()方法(例如,在TranslationServiceProvider中) 我认为文件化方法是首选方法,但是否存在功能差异?如果没有,是否有任何理由使用两种方法(除了可能的历史事故)?绑定($abstract,$concrete,$shared) 添加$abstract作为容器的键,其中$concrete是要在其位置实例化的具体类。主要用于提供接口的

Laravel文档指出绑定singleton的合适方法是使用
App::singleton()
方法,但在内部,Laravel将使用
bindShared()
方法(例如,在
TranslationServiceProvider
中)

我认为文件化方法是首选方法,但是否存在功能差异?如果没有,是否有任何理由使用两种方法(除了可能的历史事故)?

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

共享($close) 给定一个闭包(仅限),使其看起来像是共享的(实例/单例样式),并返回它。技术上等同于App::bind($key,$closure,true),但方式不同。主要用于服务提供商向IoC容器添加完全可解析的服务

bindShared($abstract,$closure) 4.1中引入的一种快捷方式,它迎合了一种常见模式。本质上帮助那些想要在容器中绑定共享实例的人。例如,见下文

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


这是从我认为这个链接应该是有益的

我一直在想同样的事情。我不知道背后的动机,但我可以说一些不同之处

以下是Laravel 4.2中两种方法的定义:

公共函数单例($abstract,$concrete=null)
{
$this->bind($abstract,$concrete,true);
}
公共函数bindShared($abstract,Closure$Closure)
{ 
$this->bind($abstract,$this->share($closure),true);
}
相似之处:

  • 这两种方法都在引擎盖下调用
    bind()
  • 这两种方法都将
    true
    传递给
    bind()
    的第三个参数,表示这是一个共享对象
  • 在这两种情况下,由于这是一个共享对象,因此对
    isShared($abstract)
    的调用将返回true
  • 在这两种情况下,由于这是一个共享对象,因此对
    make($abstract)
    的调用将只返回第一个实例
差异:

  • singleton()
    将接受
    闭包
    字符串
    bindShared()
    将只接受
    闭包
    ,而不是
    字符串
  • bindShared()
    ,除了将对象作为共享对象绑定到IOC容器中之外,还采取了额外的步骤,将传递的
    闭包
    包装在
    共享
    中,从而防止传递的
    闭包
    被多次执行。乍一看,这似乎是一个双重保证,即e对象将被视为一个单体。我只能猜测为什么这可能是可取的
  • bindShared()
    在框架内被调用87次。
    singleton()
    被调用0次

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

他们在功能上是相同的,只是
bindShared()
只接受闭包

因此,
bindShared()
在Laravel5.1(-)中被弃用,在Laravel5.2()中被删除


案例最终解决:)

那个论坛帖子是关于share()方法的,而不是关于bindShared()的方法。这个问题看起来基本上是一样的,但答案并没有真正解决我上面提到的问题。我知道这两种方法大致相同;我想找出细微差别是什么,以及什么时候/为什么应该选择一种。这间接地解释了singleton()和bindShared()的区别都是一样的,但它并没有真正回答为什么有两种方法的问题。这篇文章只是说它们“以不同的方式进行”。嗯,是的。但是为什么?:-)看起来所有的
bindShared()
调用都已改为
singleton()
在Laravel 5.0框架中。这两种方法的实现似乎是相同的。