【问题标题】:Laravel 4 - Container class: share function & closure logicLaravel 4 - 容器类:共享函数和闭包逻辑
【发布时间】: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)这里的语法和逻辑我都不懂。

【问题讨论】:

    标签: php callback closures laravel-4 anonymous-function


    【解决方案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 开发人员),这是其他任何框架都没有的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 2011-02-19
    相关资源
    最近更新 更多