在包含完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函数来处理的,第二个参数指文件所在的目录。