|
PHP复制代码
<?php
//引入预定义函数
require(BASEPATH .'/Common'.EXT );
//载入框架常量
require(APPPATH .'config/constants'.EXT );
set_error_handler('_exception_handler');
//计算程序执行时间
$BM =&load_class ('Benchmark');
$BM->mark('total_execution_time_start');//计算程序运行时间开始点
//实例化Config,这个类用于将数组封装为可以操作的配置服务;
$CFG =& load_class ('Config');
//URI和Router结合对mvc的目录结构进行解析
//实例化URI,这个类提供对 URL 的分析、构造服务;
$URI =& load_class ('URI');
//实例化Router,这个类用于分析 URL 请求,确定要执行的控制器和动作;
$RTR =& load_class ('Router');
//判断php版本,载入Base4.php或者Base5.php;
if (floor(phpversion()) < 5)
{
load_class ('Loader', FALSE);
require(BASEPATH .'Base4'.EXT );
}
else
{
require(BASEPATH .'Base5'.EXT );
}
//实例化Output,这个类提供输出内容的缓存和检查服务;
$OUT =& load_class ('Output');
if ($OUT->_display_cache ($CFG, $URI) == TRUE)
{
exit;
}
//实例化Controller,这个类使控制器生效,所有的控制器都是Controller的实例
load_class ('Controller', FALSE);
//引入控制器文件
include(APPPATH .'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().EXT );
//通过uri或默认设置得到类名和方法名
$class = $RTR->fetch_class();
$method = $RTR->fetch_method();
/*
类未定义
方法名未controller
方法名第一个字符是_,一般表示私有,不能直接访问
方法名为controller类里面定义的方法
显示404错误
*/
if ( ! class_exists($class)
OR $method == 'controller'
OR strncmp($method, '_', 1) == 0
OR in_array(strtolower($method), array_map('strtolower', get_class_methods('Controller')))
)
{
show_404 ("{$class}/{$method}");
}
$CI = new $class();
//是否使用脚手架
if ($RTR->scaffolding_request === TRUE)
{
$CI->_ci_scaffolding ();
}else{
//如果存在_remap函数,直接使用_remap方法
if (method_exists($CI, '_remap'))
{
$CI->_remap ($method);
}else{
//检查方法是否定义
if ( ! in_array(strtolower($method), array_map('strtolower', get_class_methods($CI))))
{
show_404 ("{$class}/{$method}");
}
call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2));
}
}
//输出视图数据
$OUT->_display ();
//如果连接了数据库,关闭数据库连接
if (class_exists('CI_DB') AND isset($CI->db))
{
$CI->db->close();
}
?>
复制代码
为了简化ci的分析,去掉了部分代码 |
|