二. CI3源码阅读笔记-核心文件 core/Codelgniter.php
定义框架版本
const CI_VERSION = '3.1.5';
加载常量配置文件
先从配置目录下的环境目录下加载,然后再加载config目录下的,里面定义常量代码如下:
defined('EXIT_SUCCESS') OR define('EXIT_SUCCESS', 0); // no errors
也就是说,先加载的环境目录下的文件,如果已经定义了,config目录下的将不会再次定义.从而实现了环境配置高于常规配置的效果.
设置错误处理函数
// 下面三个文件位于 框架核心目录下的 core/Common.php 文件内
set_error_handler('_error_handler'); // 错误处理函数
set_exception_handler('_exception_handler'); // 异常处理函数
register_shutdown_function('_shutdown_handler'); // 程序中止时候的函数
composer支持
如果 composer_autoload 配置项存在,则加载 vendoer/autoload.php 文件.也就是说ci3是支持composer的
加载基准测试类
该文件位置: system/core/Benchmark.php
该类可标记运行时间
- 在此处标记了两个.key分别为
total_execution_time_start和loading_time:_base_classes_start - 在核心类加载完成处标记. key为
loading_time:_base_classes_end - 控制器加载执行前. key为
controller_execution_time_{class/method}_start - 控制器执行结束后. key为
controller_execution_time_{class/method}_end
多说一句: 可以使用& load_class('Benchmark', 'core')方式获取此对象.如果有需要的话.
加载钩子
挂载点
- 系统开始前:
pre_system - 文件缓存钩子:
cache_override.如果有缓存文件则结束后面的流程,输出缓存文件 - 控制器开始执行前:
pre_controller - 控制器实例化之后:
post_controller_constructor - 控制器方法执行完成之后:
post_controller - 输出之前:
display_override - 系统结束之后:
post_system
其他类加载
- UTF8环境类: system/core/Utf8.php
- URI解析类: system/core/URI.php
- 路由类: system/core/Route.php
- 输出类: system/core/Output.php
- 安全类: system/core/Security.php
- 输入类: system/core/Input.php
- 语言包类: system/core/Lang.php
- 加载核心控制器类: system/core/Controller.php
配合路由执行控制器方法或者返回404
小结
- ci3里面的是
输入类, 注意与现代框架的请求类在职责和功能上的区别.这个问题等看到输入类的时候再做说明.不同的名字背后有不同的思想 - 哐哐一顿操作,最后的目的是为了执行控制器.
- 中间有几个钩子.由于框架核心没有自动加载,使用的是
load_class方法手动加载的.钩子的位置决定是否可以使用某些核心类,毕竟有些类可能还没有载入. - 可以利用钩子做一些事情.比如想模拟某些框架的
请求中间件.就可以在pre_controller钩子处实现.

浙公网安备 33010602011771号