icebolt 发表于 2009-3-10 12:06:16

ci源码分析--核心文件


<?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的分析,去掉了部分代码

icebolt 发表于 2009-3-10 12:09:38

call_user_func_array
这个函数大家可能用的比较少,array(&$CI, $method),参数表示调用$ci类的$method方法,array_slice($URI->rsegments, 2),是$method方法的参数

sam 发表于 2009-3-10 17:17:16

顶楼主,我分析的还没来得及共享:),加油,大家就靠你了!

y1d2y3xyz 发表于 2009-6-2 15:12:01

我觉得应该不是单纯的从文件分析代码,应该从整个目录结构去分析,从面向对象的方法上去分析,就象J2EE设计中构架一样,让人看就一目了然,先从整体再到局部,站在一个高的角度去看CI的代码结构,然后才是具体的代码分析,这样的对于CI的设计思想和出发点就很好理解!我也是这俩天才开始学CI,想在这几天搞定!因为之前都是自己封装,但有时候麻烦,所以也想用用CI,希望效率会快一点,因为时间就是RMB,而且听说CI上手快!支持CI!!希望大家共同进步!

zhangkewang 发表于 2010-7-23 16:51:55

慢慢来
看了要顶

k1060220963 发表于 2010-8-11 09:03:01

我顶你,看好你哦

lioncn 发表于 2011-5-7 15:53:51

学习中。。。。。

阳光笑脸 发表于 2012-3-1 21:54:46

学习中。。。。。{:1_1:}

紫皇の飛翔 发表于 2012-7-12 16:39:52

{:1_1:}学习学习!!!

普林 发表于 2012-8-3 17:57:01

真好啊
页: [1] 2
查看完整版本: ci源码分析--核心文件