gpt4 book ai didi

php - Laravel 4 - 容器类 : share function & closure logic

转载 作者:可可西里 更新时间:2023-11-01 13:13:26 25 4
gpt4 key购买 nike

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

我和 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) 的语法,也不理解其中的逻辑。

最佳答案

作为引用,这是 share method @ v4.0.5 .

所以,这里发生了什么。我将分几个步骤进行解释。

调用分享方法

正如您所指出的,此方法是从服务提供商处调用的。因此,FilesystemServiceProvider 调用了如下所示的方法:

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

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

那么 Share 有什么作用?

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

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

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

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

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

尽管如此,99% 的服务实际上使用了 share 方法,因为在闭包内部工作允许使用更复杂的依赖项实例化对象。

希望这对您有所帮助。

关于php - Laravel 4 - 容器类 : share function & closure logic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17296224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com