我一直在挖掘Laravel的核心,因为我想了解它是如何工作的。但我提出了一种方法,即使在3天之后我也无法绕过头脑。 在start.php中,应用程序绑定到自身。到现在为止还挺好。但当我检查$ app->共享方法时,我迷路了。
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']是一个闭包对象。但是,如果我执行get_class,则该类是Illuminate \ Foundation \ Application。 此外,也无法执行它,因为$ app'app'显然不会起作用。
答案 0 :(得分:3)
$app
不是普通数组,它实际上是Illuminate\Foundation\Application
1的实例,Illuminate\Container\Container
2的扩展,实现了ArrayAccess
}。但是你已经知道了,因为这就是share()
方法所在的地方。
容器将键绑定到闭包,当访问键时,从内存中获取值,或者在第一次访问时,调用绑定闭包并返回结果值。当在容器上设置一个键时,它将被封装在一个闭包中,除非它已经是一个闭包。
这为容器提供了一致的内部接口,因此代码不会经常键入检查其内容。它也只会将实际使用的引用加载到内存中 - 认为闭包的占用空间比完全加载的类实例的占用空间要小。但是一旦加载,您就可以在请求的其余部分使用相同的实例。
为什么应用程序没有使用instance()
在容器上注册我不知道 - 也许它在跟踪和转储输出中产生递归引用。