![](https://img.kancloud.cn/ac/22/ac22ee99c8665a9a9f185cfd19272590_1069x616.png)![](https://img.kancloud.cn/7b/fb/7bfb27edebdf874fd1ece9d15ee50aef_1163x464.png)~~~
require __DIR__ . '/../vendor/autoload.php'; //加载composer文件
// 执行HTTP应用并响应
$http = (new App())->http; //实例化think\app 核心类,执行里面的http::class的构造方法
为什么会执行http的构造方法呢,我们在think\App 并没有发现有http这个方法,实际上调用了think\App的父类 __get魔术方法
~~~
/**
* 获取容器中的对象实例
* @access public
* @param string $abstract 类名或者标识
* @return object
*/
public function get($abstract)
{
if ($this->has($abstract)) {
return $this->make($abstract);
}
throw new ClassNotFoundException('class not exists: ' . $abstract, $abstract);
}
~~~
会在bind 类里面匹配当前传递的这个http名称然后找到这个http::class的实例
可以看到这个http构造方法仅做了一步:
加载项目根目录route下的app.php
里面可以看到app是通过助手函数基类helper.php 进行加载的.但是这一步是还没有执行的,因为helper助手函数基类还没有被include进去,include操作在~~~
$response = $http->run();
http类的runWithRequest 里面执行了http类的初始化initialize
1 可以看到里面主要是用了ini模式加载的我们常用的.env文件
2 debug模式输出缓存区到页面方便调试
接下来的几个加载比较重要
3 加载了common.php我们的自定义函数库(类似于下面提到的helper)以及helper.php
4 循环加载了app路径下的 config目录下的config文件,所以config目录下的所有文件都是会默认全部加载的
5 加载app/event.php数组里面的event .使用观察者模式注册到event类
6 加载app/service.php 然后调用register方法
~~
$response->send();
$http->end($response);
~~~