作为参考,这是share方法@v4.0.5 https://github.com/laravel/framework/blob/v4.0.5/src/Illuminate/Container/Container.php#L126.
那么,这里发生了什么。我将分几步进行解释。
调用分享方法
正如您所指出的,此方法是从服务提供商调用的。所以FilesystemServiceProvider
调用这个方法,看起来像这样:
$this->app['files'] = $this->app->share(function() { return new Filesystem; });
它正在分配return这个的值share
方法到容器中的绑定。简而言之,该返回值将是新的Filesystem
闭包中返回的实例。
那么共享有什么作用呢?
The share
方法只是在 IoC 容器中定义单例的另一种方式。所有这些一开始可能有点令人生畏。基本上,Laravel 本身就是一个 IoC 容器。所有类都作为实例绑定在容器上。有时这些实例应该是same每次调用时都有实例。
如果您在 GitHub 上查看上面的引用方法,您会注意到闭包内部定义了一个静态变量。然后它检查该变量是否为 null,如果是,则解析闭包(这是返回我们新的闭包)Filesystem
实例)。然后它只是返回变量。
现在,下次您使用时File::get()
它不需要实例化Filesystem
再次类,因为它已经被实例化并存储在静态中$object
多变的。所以它只是将相同的对象返回给您。
So!真的,你可以替换$this->app['files']
与此一致,它仍然有效。
$this->app->instance('files', new Filesystem);
99% 的服务实际使用share
方法,因为在闭包内工作允许使用更复杂的依赖关系实例化对象。
希望这可以帮助。