距离上篇介绍Hook已经过去一阵子了,这段期间通过借鉴CI的设计思路,自己实现了一个简单的框架helpful-tools,经过这段时间的工作实践,对CI框架也有了一些新的认识;故而本篇从CI3的源码分析角度,对整个框架的一个大致结构做一个阶段性理解总结;
本文中所有文件结构均为默认结构,为了简便起见一般不列出代码,请结合源码浏览)
本文中一些需要额外注意的部分以[0-9]的形式给出,请在文末附录出查看)
入口文件:index.php在入口文件中,主要实现了一些项目中用到的目录变量,工作环境变量,报错信息等的设置;对主要的application,views目录进行了判断(是否存在,是否为文件夹类型)[1],最后引入核心文件中的core/CodeIgniter.php,开始框架执行流程
核心框架文件:system/core/CodeIgniter.php本文件为整个框架的核心,从其命名上即可窥见一斑;以下列举文件中一些关键点:
检测是否由入口文件进入:defined('BASEPATH') OR exit('No direct script access allowed');如果是直接访问(不通过index.php)则返回错误
require_once,即包含各类核心文件所用的函数[2],以下予以列举:
load_class: 定义于Common中,全局类加载器
log_message: 定义于Common中,全局记录器
error_handler:处理所有的错误
exception_handler: 处理全局异常
register_shutdown_function:用于处理所有会导致中止执行的错误
如果配置项中开启了composer自动加载,则调用application/vendor/autoload.php进行自动加载
通过类加载器启动一个执行时间记录器Benchmark, 记录框架加载各部分的时间
启动配置类(Config.php), 加载配置文件
启动钩子(Hook)系统,如前篇文章所介绍CI框架(CodeIgniter)使用技巧和步骤小结(四)的一样,利用闭包来调用函数/类方法
字符集处理/转换扩展启动(mbstring,iconv)
加载一系列工具类,如URI类,路由类(ROUTER)【该部分内容将在下一篇中重点介绍,敬请期待:),打算作为第六篇】,输出类(缓存,响应头,响应格式等)【第七篇】
核心成分:控制器的加载
调用一系列钩子,完成加载(实际上钩子的调用是贯穿整个流程的)
完成
作者:萨秋(掠影)
转载请联系原作者
邮件:ryoalex@foxmail.com
本篇主要介绍了框架的整个流程,CI框架的核心为CodeIgniter.php文件,通过文件包含的形式调用了诸多核心文件;
其中重点为Config.php里的load_class(),Hooks.php里的call_hook()与Loader里面的initialize()和各种load方法,这些部分的实现都是相当有趣的,值得投入更深的精力去仔细研究,也是本人下几篇博文的重点研究对象(笑)