Laravel 4 - 容器类:共享函数和闭包逻辑

Posted

技术标签:

【中文标题】Laravel 4 - 容器类:共享函数和闭包逻辑【英文标题】:Laravel 4 - Container class: share function & closure logic 【发布时间】:2013-06-22 04:25:50 【问题描述】:

对于此处讨论的问题,我有一个后续问题: Laravel core method confusion

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

从这篇文章开始,我一直在从另一个角度看待这个问题: 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)这里的语法和逻辑我都不懂。

【问题讨论】:

【参考方案1】:

供参考,这是share method @ v4.0.5。

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

调用共享方法

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

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

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

那么分享有什么用呢?

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

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

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

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

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

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

希望这会有所帮助。

【讨论】:

感谢您的出色回答,我想知道为什么它不被接受?无论如何,Laravel 让我终于掌握了 PHP(我是一名长期的 JS 开发人员),这是其他任何框架都没有的。

以上是关于Laravel 4 - 容器类:共享函数和闭包逻辑的主要内容,如果未能解决你的问题,请参考以下文章

Laravel全局传递参数

laravel容器container 阅读记录

闭包和迭代器

在 Laravel 4 中将数据传递给闭包

Laravel 7:无法为序列化准备路由 [api/user]。使用闭包。 (逻辑异常)[重复]

Laravel 控制器