在包含完 common.php 中的函数后,开始真正的进行一些列的工作。

先是做一些安全方面的处理问题,如果 PHP 的版本 <=5.4,那么会进行防注册全局变量的操作,因为注册全局变量的功能在 PHP5.3 开始被废弃,并且在 PHP5.4 以后被移除了。

紧接着设置了错误处理:

    // 设置错误处理
    set_error_handler('_error_handler');
    set_exception_handler('_exception_handler');
    register_shutdown_function('_shutdown_handler');

接下来检查了核心类扩展的前缀问题:

    if ( ! empty($assign_to_config['subclass_prefix']))
    {
        get_config(array('subclass_prefix' => $assign_to_config['subclass_prefix']));
    }

通常情况下 $assign_to_config 变量应当在 index.php 中设置,subclass_prefix 的值在 APPPATH/config/config.php 文件中设置。
这里通过 $assign_to_config['subclass_prefix'] 指定用户的扩展核心的前缀名。
注意一点,index.php 中的 subclass_prefix 具有更高的优先权。

紧接着检查了是否应当使用 Composer autoloader 来进行加载。暂时忽略这部分。

后面的部分就是加载了一系列的组件来帮助 CI 完成更多的功能,并进行一系列的初始化操作。
基准测试类 BM(Benchmark),用于计时、性能测试等功能。
扩展组件 EXT(Hooks),CI 的扩展组件,类似于钩子,可以在不改变 CI 核心代码的情况下增加功能。然后调用了 pre_system 这个挂钩点,如果存在的话。
配置文件管理 CFG(Config),用于加载配置文件,获取配置项等。加载完成后也处理了一下 $assign_to_config 的变量。
UNI(Utf-8),负责处理 UTF-8 相关的工作。
URI 和 RTR,前者负责解析 URI 并获取参数等,后者是路由组件
OUT(output),输出组件,所有的输出均是通过该组件输出的。
SEC(Security),负责处理安全相关的问题。
IN(Input),负责处理输入相关的东西。
LANG(Lang),处理语言相关的东西。

这些组件的加载方式都是通过调用 load_class 函数来处理的,第二个参数指文件所在的目录。