用户
 找回密码
 入住 CI 中国社区
搜索
查看: 16297|回复: 11
收起左侧

ci源码分析--核心文件

[复制链接]
发表于 2009-3-10 12:06:16 | 显示全部楼层 |阅读模式
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的分析,去掉了部分代码
 楼主| 发表于 2009-3-10 12:09:38 | 显示全部楼层
call_user_func_array
这个函数大家可能用的比较少,array(&$CI, $method),参数表示调用$ci类的$method方法,array_slice($URI->rsegments, 2),是$method方法的参数
发表于 2009-3-10 17:17:16 | 显示全部楼层
顶楼主,我分析的还没来得及共享:),加油,大家就靠你了!
发表于 2009-6-2 15:12:01 | 显示全部楼层
我觉得应该不是单纯的从文件分析代码,应该从整个目录结构去分析,从面向对象的方法上去分析,就象J2EE设计中构架一样,让人看就一目了然,先从整体再到局部,站在一个高的角度去看CI的代码结构,然后才是具体的代码分析,这样的对于CI的设计思想和出发点就很好理解!我也是这俩天才开始学CI,想在这几天搞定!因为之前都是自己封装,但有时候麻烦,所以也想用用CI,希望效率会快一点,因为时间就是RMB,而且听说CI上手快!支持CI!!希望大家共同进步!
发表于 2010-7-23 16:51:55 | 显示全部楼层
慢慢来
看了要顶
发表于 2010-8-11 09:03:01 | 显示全部楼层
我顶你,看好你哦
发表于 2011-5-7 15:53:51 | 显示全部楼层
学习中。。。。。
发表于 2012-3-1 21:54:46 | 显示全部楼层
学习中。。。。。
发表于 2012-7-12 16:39:52 | 显示全部楼层
学习学习!!!
发表于 2012-8-3 17:57:01 | 显示全部楼层
真好啊

本版积分规则