Laravel 拉维核心法

Laravel 拉维核心法,laravel,laravel-4,Laravel,Laravel 4,我一直在挖掘Laravel的核心,因为我想了解它是如何工作的。但是我想出了一个方法,即使在三天后我也无法控制自己。 在start.php中,应用程序绑定到自身。到现在为止,一直都还不错。但是当我检查$app->share方法时,我迷路了 public function share(Closure $closure) { return function($container) use ($closure) { // We'll simply declare

我一直在挖掘Laravel的核心,因为我想了解它是如何工作的。但是我想出了一个方法,即使在三天后我也无法控制自己。 在start.php中,应用程序绑定到自身。到现在为止,一直都还不错。但是当我检查$app->share方法时,我迷路了

    public function share(Closure $closure)
{
    return function($container) use ($closure)
    {

        // We'll simply declare a static variable within the Closures and if
        // it has not been set we'll execute the given Closure to resolve
        // the value and return it back to the consumers of the method.
        static $object;
        if (is_null($object))
        {
            $object = $closure($container);
        }

        return $object;
    };
}
此方法返回一个匿名函数,该函数在执行时返回应用程序的实例。我看对了吗?为什么会这样?为什么要返回闭包而不仅仅是实例。这似乎是一种奇怪的方式,但我确信这是有原因的

更新 start.php中的行:

$app['app'] = $app->share(function($app) { return $app; });
所以我认为$app['app']是一个闭包对象。但是,如果我得到了\u类,则该类为illumb\Foundation\Application。
此外,也没有办法执行它,因为$app'app'显然不起作用。

$app
不是普通数组,它实际上是
illumb\Foundation\Application
的一个实例,是
illumb\Container\Container
的扩展,它实现了
arrayaaccess
。但是您已经知道了这一点,因为
share()
方法就存在于此

容器将键绑定到闭包,当访问键时,从内存获取值,或者在第一次访问时,调用绑定闭包并返回结果值。在容器上设置密钥时,除非它已经是一个闭包,否则它将被包装在闭包中

这为容器提供了一个一致的内部接口,因此代码不会不断地对其内容进行类型检查。它也只会将您实际使用的引用加载到内存中——人们认为闭包的占用空间比完全加载的类实例要小。但一旦加载,您就可以在请求的其余部分使用相同的实例


为什么应用程序没有使用
instance()
在容器上注册呢?我不知道,也许它会在跟踪和转储输出中产生递归引用。

这似乎是单例和控制反转(IoC)设计模式的组合。当然这是为了可扩展性,但我不确定为什么它是这样构建的。非常感谢!。回答得很好。当我读到它时,我意识到我与我的理论很接近,但你的回答肯定让它更清楚!