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 - 容器类:共享函数和闭包逻辑的主要内容,如果未能解决你的问题,请参考以下文章