咱接上一节接着看
- 处理字符串编码及mbstring、iconv 函数
$charset = strtoupper(config_item('charset'));
ini_set('default_charset', $charset);
if (extension_loaded('mbstring'))
{
define('MB_ENABLED', TRUE);
// mbstring.internal_encoding is deprecated starting with PHP 5.6
// and it's usage triggers E_DEPRECATED messages.
@ini_set('mbstring.internal_encoding', $charset);
// This is required for mb_convert_encoding() to strip invalid characters.
// That's utilized by CI_Utf8, but it's also done for consistency with iconv.
mb_substitute_character('none');
}
else
{
define('MB_ENABLED', FALSE);
}
// There's an ICONV_IMPL constant, but the PHP manual says that using
// iconv's predefined constants is "strongly discouraged".
if (extension_loaded('iconv'))
{
define('ICONV_ENABLED', TRUE);
// iconv.internal_encoding is deprecated starting with PHP 5.6
// and it's usage triggers E_DEPRECATED messages.
@ini_set('iconv.internal_encoding', $charset);
}
else
{
define('ICONV_ENABLED', FALSE);
}
if (is_php('5.6'))
{
ini_set('php.internal_encoding', $charset);
}
- 加载一些函数方法(做了兼容性处理)
require_once(BASEPATH.'core/compat/mbstring.php');
require_once(BASEPATH.'core/compat/hash.php');
require_once(BASEPATH.'core/compat/password.php');
require_once(BASEPATH.'core/compat/standard.php');
接下来就是加载一些框架核心类…好无聊!!继续往下看
- 引入核心控制器类
# 这是控制器的核心基类,自定义的控制器类都要继承它
require_once BASEPATH.'core/Controller.php';
- 这里定义类一个方法和引入
# 后面再讲
function &get_instance()
{
return CI_Controller::get_instance();
}
# 如果存在 MY_Controller.php 则需引入,为什么是MY_...后面会讲
if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'))
{
require_once APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php';
}
// Set a mark point for benchmarking
# 这里打上类一个bm 标记,表示所有框架核心基类加载结束所用的时间
# 我们可以调用Benchmark类中的elapsed_time方法查看
# echo $BM->elapsed_time('loading_time:_base_classes_start','loading_time:_base_classes_end') . 's';
$BM->mark('loading_time:_base_classes_end');
- 初始化默认控制器和默认方法,然后处理默认控制器和方法不存在则输出 404 页面
# 首先设置404为 false
$e404 = FALSE;
# 获取application中的 routes.php 配置的默认控制名(welcome),首字母大写
$class = ucfirst($RTR->class);
# 获取默认控制器的默认请求方法(index)
$method = $RTR->method;
- 实例化默认控制器类并调用默认方法
# $class 为 Welcome
$CI = new $class();
# 回调 Welcome 中的 index 方法
call_user_func_array(array(&$CI, $method), $params);
后面就剩下引入一些存在的钩子,好啦,CodeIgniter.php 文件就看完啦!是不是很清晰了呢?下面我总结下CodeIgniter.php主要做了哪些工作:
- 引入框架核心类库、常量、方法库
- 用户请求的安全全局处理,就是那锅 is_php(5.4)
- 加载框架定义的错误、异常、结束处理类
- 判断了是否要引入Composer 的 autoload.php文件
- 实例化了默认控制器(Welcome),调用默认方法(index),输出了欢迎界面。
大家每次看到的欢迎界面就是从这个地方输出的,大家是不是感觉好神奇,更迫切的想继续往下看了呢?哈哈哈,这样一来,整个CI的初始化的主线副本任务就完成了,是不是很简单?接下来,我们接着进入支线任务哈~~
哈哈哈,莫慌,咱们继续!!!