tp5.1源码, 近日研究了一下 , 也颇有收获,总结一下:
1. 自动加载
首先从框架的入口文件,public 文件夹下的 index.php 入口文件 , index文件 加载了 base.php 文件,下面来看下base.php文件
可以看到, 加载了 Loader类 , 作用: 实现了自动加载机制, 自动加载对应需要的类, 如果不存在,则去自动查找该类并引入
// 载入Loader类
require __DIR__ . '/library/think/Loader.php';
// 注册自动加载
Loader::register();
2.Ioc容器
接下来, base文件 加载了 Ioc容器类 , 将一些核心常用类注册到 容器类里 ,
// 注册核心类到容器
Container::getInstance()->bind([
'app' => App::class,
'build' => Build::class,
'cache' => Cache::class,
'config' => Config::class,
'cookie' => Cookie::class,
'debug' => Debug::class,
'env' => Env::class,
'hook' => Hook::class,
'lang' => Lang::class,
'log' => Log::class,
'request' => Request::class,
'response' => Response::class,
'route' => Route::class,
'session' => Session::class,
'url' => Url::class,
'validate' => Validate::class,
'view' => View::class,
// 接口依赖注入
'think\LoggerInterface' => Log::class,
]);
3. 门面模式 Facade
// 注册核心类的静态代理
Facade::bind([
facade\App::class => App::class,
facade\Build::class => Build::class,
facade\Cache::class => Cache::class,
facade\Config::class => Config::class,
facade\Cookie::class => Cookie::class,
facade\Debug::class => Debug::class,
facade\Env::class => Env::class,
facade\Hook::class => Hook::class,
facade\Lang::class => Lang::class,
facade\Log::class => Log::class,
facade\Request::class => Request::class,
facade\Response::class => Response::class,
facade\Route::class => Route::class,
facade\Session::class => Session::class,
facade\Url::class => Url::class,
facade\Validate::class => Validate::class,
facade\View::class => View::class,
]);
4.加载配置文件
// 加载惯例配置文件
facade\Config::set(include __DIR__ . '/convention.php');