6

我对这里讨论的问题有一个后续问题: Laravel 核心方法混淆

我和 driechel(上述问题的作者)以前的情况相同,目前正在习惯 Laravel 4 FW 并检查核心。尽管已经给出了准确的答案,但我仍然不明白其中的逻辑以及幕后发生的事情。所以我非常感谢进一步的解释。我知道这可能是重复的,但由于我无法发表评论,但我会尝试提出一个新问题。希望这样可以。

从这篇文章开始,我一直在从另一个角度看待这个问题:http: //blog.joynag.net/2013/05/facades-in-laravel-4-and-static-methods-resolution/

在检查调用时,File:get()我最终以使用此实际参数调用的Container 类的共享函数share(function() { return new Filesystem; }结束。

我只是想不通的是$container. 特别是在闭包内的第二次出现时:

$object = $closure($container);

你能再澄清一下吗?为什么$container在这里作为参数传递,其中实际包含什么?据我了解$closure,在这一点上保持并执行function() { return new Filesystem; }没有输入参数。

我搞不清楚了。现在连续两天研究了这个和 PHP 匿名函数/闭包,但仍然无法弄清楚。我既不了解$closure($container)这里的语法也不了解逻辑。

4

1 回答 1

11

作为参考,这是share@ v4.0.5 的方法

那么,这里发生了什么。我将分几个步骤来解释它。

调用 Share 方法

正如您所指出的,此方法是从服务提供商调用的。所以,FilesystemServiceProvider调用这个方法看起来像这样:

$this->app['files'] = $this->app->share(function() { return new Filesystem; });

它将此方法的返回值分配给share容器中的绑定。简而言之,该返回值将是Filesystem闭包中返回的新实例。

那么共享有什么作用呢?

share方法只是在 IoC 容器中定义单例的另一种方式。这一切起初可能有点吓人。基本上,Laravel 本身就是一个 IoC 容器。所有类都绑定为容器上的实例。有时这些实例在每次调用时都应该是相同的实例。

如果您查看 GitHub 上的上述引用方法,您会注意到在闭包内部定义了一个静态变量。然后它检查该变量是否为空,如果是,则解析闭包(这是返回我们的新Filesystem实例的闭包)。然后它只是返回变量。

现在,下次使用File::get()它时不需要Filesystem再次实例化该类,因为它已经实例化并存储在静态$object变量中。所以它只是将相同的对象返回给您。

所以!真的,你可以$this->app['files']用这个替换这条线,它仍然可以工作。

$this->app->instance('files', new Filesystem);

99% 的服务实际上使用了该share方法,因为在闭包内工作允许使用更复杂的依赖关系实例化对象。

希望这可以帮助。

于 2013-06-26T11:15:19.067 回答