标签:protect 路径 cat bindings min ica this core nbsp
在入口文件里可以看到
$app = require_once __DIR__.‘/../bootstrap/app.php‘;
$app这个是laravel的全局变量,在里面可以看到实例化了这个类
$app = new Illuminate\Foundation\Application(
realpath(__DIR__.‘/../‘)
);
里面的构造函数做了4件事
1,注册基本的绑定,把当前类的对象绑定到app和Illuminate\Container\Container中
$this->registerBaseBindings();
2,注册服务提供器,里面注册了EventServiceProvider和RoutingServiceProvider,详细的没研究过,以后有机会在研究
$this->registerBaseServiceProviders()
3,注册别名
$this->registerCoreContainerAliases();
4,绑定一些项目内有可能用到的路径
if ($basePath) {
$this->setBasePath($basePath);
}
接下来就一个一个的分析一下里面是用来做什么的
protected function registerBaseBindings()
{
static::setInstance($this);//获取当前类的实例,规定了要实现ContainerContract接口的类才可以实例化
$this->instance(‘app‘, $this);
$this->instance(‘Illuminate\Container\Container‘, $this);
}
第一句
public static function setInstance(ContainerContract $container)
{
static::$instance = $container;
}
就把当前类的对象赋值给当前类的$instance变量,方便以后调用
剩下的就是调用instance方法来绑定对象到容器了
看看laravel是怎么绑定对象到容器的
public function instance($abstract, $instance)
{
$abstract = $this->normalize($abstract);//如果是字符串,就把前面的斜线去掉
if (is_array($abstract)) {
list($abstract, $alias) = $this->extractAlias($abstract);
$this->alias($abstract, $alias);
}//如果是数组,例如$this->instance([‘app‘=>‘a‘],$this),就存进$this->aliases中,变成$this->aliases[‘app‘] = ‘a‘;没用过这个绑定方法,查看其他资料看到的
unset($this->aliases[$abstract]);
$bound = $this->bound($abstract);//返回一个布尔值,用于下面判断是否执行回调函数
$this->instances[$abstract] = $instance;//这里就是把变量绑定到instance数组中,例如传进来的是($app,$this),所以绑定成$this->instance[‘app‘] = new a();a代表传进来的类
if ($bound) {//如果为真,就调用$this->reboundCallback[]里有没有回调函数,有的话就调用
$this->rebound($abstract);
}
}
未完....
标签:protect 路径 cat bindings min ica this core nbsp
原文地址:http://www.cnblogs.com/gikkson/p/6849052.html