ThinkPHP源码分析之核心类文件的加载
研究了下TP的加载机制,以下是我的一些总结:
1.首先由应用入口文件index.php引入TP入口文件ThinkPHP.php
2.ThinkPHP.php里主要是定义一些系统常量,URL模式定义,系统信息等,然后加载核心类文件Think.class.php,这个类里定义了start方法,这个方法是系统加载的核心,ThinkPHP的核心函数和类文件加载,配置文件加载,字段映射加载,行为扩展加载,运行时日志等的生成,模块目录的生成等都在这个方法里有调用
3.start方法一开始定义注册了自动加载方法,错误和异常处理的方法
//注册AUTOLOAD方法spl_autoload_register('Think\Think::autoload');//设定错误和异常处理register_shutdown_function('Think\Think::fatalError');set_error_handler('Think\Think::appError');set_exception_handler('Think\Think::appException');
然后是初始化文件的存储方式
// 初始化文件存储方式
Storage::connect(STORAGE_TYPE);这里TP里定义了本地存储和sae环境下的存储类
接着是核心类文件等的加载,TP里根据APP_MODEL判断php的应用模式,根据不同的模式加载对应的核心文件,默认是common模式,如果是api或sae模式,则加载Library/Model下对应的核心文件,比如common.php,这里定义了系统要加载的核心配置文件,核心函数,核心类,map映射,行为扩展方法等。也就是说TP通过在对应的模式文件下提前定义好要加载的核心配置文件等的路径信息,然后循环进行加载。
//读取应用模式$mode=includeis_file(CONF_PATH.'core.php')?CONF_PATH.'core.php':MODE_PATH.APP_MODE.'.php';//这里判断应用模式,$model是一个数组,定义了配置文件,核心类文件等的路径//加载核心文件foreach($mode['core']as$file){if(is_file($file)){include$file;if(!APP_DEBUG)$content.=compile($file);//这里表示运行模式下将引入的核心类文件内容保存到~runtime.php文件里,这样后面直接引入~runtime.php文件}}//加载应用模式配置文件foreach($mode['config']as$key=>$file){is_numeric($key)?C(load_config($file)):C($key,load_config($file));}//读取当前应用模式对应的配置文件if('common'!=APP_MODE&&is_file(CONF_PATH.'config_'.APP_MODE.CONF_EXT))C(load_config(CONF_PATH.'config_'.APP_MODE.CONF_EXT));//加载模式别名定义if(isset($mode['alias'])){self::addMap(is_array($mode['alias'])?$mode['alias']:include$mode['alias']);}//加载应用别名定义文件if(is_file(CONF_PATH.'alias.php'))self::addMap(includeCONF_PATH.'alias.php');//加载模式行为定义if(isset($mode['tags'])){Hook::import(is_array($mode['tags'])?$mode['tags']:include$mode['tags']);}//加载应用行为定义if(is_file(CONF_PATH.'tags.php'))//允许应用增加开发模式配置定义Hook::import(includeCONF_PATH.'tags.php');
4.调试模式下和非调试模式下的加载
这里非调试模式下,在Runtime目录下会有一个~runtime.php的文件,打开会发现这个是经过编译后的源码文件,里面包含核心配置文件,核心类,map映射等的源码。也就是说在运行模式下,TP会把加载的核心配置文件,核心类等的内容保存到这个文件里,这样每次直接调用~runtime.php文件相当于把核心类等直接引入过来,加快了程序运行的速度。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。