Php 什么';应用程序::singleton和bindShared之间的区别是什么?
Laravel文档指出绑定singleton的合适方法是使用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是要在其位置实例化的具体类。主要用于提供接口的
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()
- 在这两种情况下,由于这是一个共享对象,因此对
的调用将返回trueisShared($abstract)
- 在这两种情况下,由于这是一个共享对象,因此对
的调用将只返回第一个实例make($abstract)
将接受singleton()
或闭包
字符串
将只接受bindShared()
,而不是闭包
字符串
,除了将对象作为共享对象绑定到IOC容器中之外,还采取了额外的步骤,将传递的bindShared()
包装在闭包
中,从而防止传递的共享
被多次执行。乍一看,这似乎是一个双重保证,即e对象将被视为一个单体。我只能猜测为什么这可能是可取的闭包
在框架内被调用87次。bindShared()
被调用0次singleton()
bindShared()
只接受闭包
因此,bindShared()
在Laravel5.1(-)中被弃用,在Laravel5.2()中被删除
案例最终解决:)那个论坛帖子是关于share()方法的,而不是关于bindShared()的方法。这个问题看起来基本上是一样的,但答案并没有真正解决我上面提到的问题。我知道这两种方法大致相同;我想找出细微差别是什么,以及什么时候/为什么应该选择一种。这间接地解释了singleton()和bindShared()的区别都是一样的,但它并没有真正回答为什么有两种方法的问题。这篇文章只是说它们“以不同的方式进行”。嗯,是的。但是为什么?:-)看起来所有的
bindShared()
调用都已改为singleton()
在Laravel 5.0框架中。这两种方法的实现似乎是相同的。