【发布时间】:2013-03-23 10:36:21
【问题描述】:
我一直在挖掘 Laravel 的核心,因为我想了解它是如何工作的。但是我想出了一个方法,即使在 3 天后我也无法理解。 在 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'] 是一个闭包对象。但是,如果我做 get_class 类是 Illuminate\Foundation\Application 。 此外,也没有办法执行它,因为 $app'app' 显然不起作用。
【问题讨论】:
-
这似乎是单例和控制反转 (IoC) 设计模式的组合。当然这是为了可扩展性,但我不知道为什么它是这样构建的。