Ist*_*med 4 php laravel laravel-service-container
在Laravel的服务容器中,我可以绑定单例和实例。来自 Laravel文档:
绑定单例
单例方法将一个类或接口绑定到容器中,该容器只应解析一次。一旦解析了单例绑定,后续调用容器时将返回相同的对象实例:
Run Code Online (Sandbox Code Playgroud)$this->app->singleton('HelpSpot\API', function ($app) { return new HelpSpot\API($app->make('HttpClient')); });
绑定实例
您还可以使用实例方法将现有对象实例绑定到容器中。给定的实例将始终在后续调用容器时返回:
Run Code Online (Sandbox Code Playgroud)$api = new HelpSpot\API(new HttpClient); $this->app->instance('HelpSpot\API', $api);
Q1)那么这两个概念有什么区别?我可以猜测,对于单例绑定,Laravel 在第一次请求时通过内部服务容器机制构建对象本身,然后在后续调用中提供它,而在实例绑定的情况下,服务容器会显式地给出一个已经构建的对象,它在每个要求?
或者还有其他的解释吗?
Q2)为什么我们需要这两种绑定选项?
singleton
和之间的区别instance
这两个概念非常相似。实际上,唯一的区别是您要么传入类/接口,要么传入对象。
单例文档:
单例方法将一个类或接口绑定到容器中,该容器只应解析一次。一旦单例绑定被解析,相同的对象实例将在后续调用容器时返回
实例文档
您还可以使用实例方法将现有对象实例绑定到容器中。给定的实例将始终在后续调用容器时返回
这个问题的答案可能植根于 Laravel 哲学。从我所看到的 Laravel 提供的大多数功能来看,解决问题的方法不止一种。感觉这也是其中之一。在某些情况下,存在一些细微的差异,这可能会导致singleton
或使用更可取。instance
使用singleton
将有助于保持应用程序的轻量级,因为如果不使用这些类/接口,则不会创建它们。
在某些情况下,您可能已经创建了一个对象,但仍需要将其注入到其他位置。这就是instances
发挥作用的地方。