1、首先来看CI的整体架构图:

其中:application是用户级开发目录,我们关心system系统源码目录,CI的核心代码都在这里了。
1、core 系统核心代码
2、database数据库相关的操作和帮助类
3、helpers 系统提供的一些工具类
4、language 语言包
5、libraries 系统依赖类
2、CI的代码流程

我们初次访问CI的时候进入的welcome页面,那么这个welcome的页面请求都经过了哪些地方呢,我们来追踪一下。
所以对ci的请求,都是首先进入index.php文件。在index.php文件中进行CI框架的初始化操作,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | define( 'ENVIRONMENT' , isset( $_SERVER [ 'CI_ENV' ]) ? $_SERVER [ 'CI_ENV' ] : 'development' ); define( 'SELF' , pathinfo ( __FILE__ , PATHINFO_BASENAME)); define( 'BASEPATH' , $system_path ); define( 'FCPATH' , dirname( __FILE__ ).DIRECTORY_SEPARATOR); define( 'SYSDIR' , basename (BASEPATH)); define( 'APPPATH' , $application_folder .DIRECTORY_SEPARATOR); define( 'VIEWPATH' , $view_folder .DIRECTORY_SEPARATOR); require_once BASEPATH. 'core/CodeIgniter.php' ; |
在index.php文件中定义了必要的全局变量,最后引入了core/CodeIgniter.php核心类。那我们追踪到core/CodeIgniter.php中,文件中首先引入了:
1 2 3 | require_once (APPPATH. 'config/constants.php' ); require_once (BASEPATH. 'core/Common.php' ); |
之后又实例化了 Benchmark、Hooks、Config、Log、Utf8、URI、Router、Output、Security、Input、Lang 类,引入是调用common.php中的load_class方法实现的。
1 2 3 | $class = ucfirst( $RTR -> class ); $method = $RTR ->method; |
在路由中提取出对应要调用的class和method,然后实例化class且调用方法:
1 2 3 | $CI = new $class (); call_user_func_array( array (& $CI , $method ), $params ); |
其前后调用了四个钩子:
1 2 3 4 5 6 7 | $EXT ->call_hook( 'pre_controller' ); $EXT ->call_hook( 'post_controller_constructor' ); $EXT ->call_hook( 'post_controller' ); $EXT ->call_hook( 'post_system' ); |
这里解析出的class和method,其实就是Welcome和index,之后我们 进入application/controllers/Welcome.php类后发现,类里只有
1 2 3 4 5 | public function index(){ $this ->load->view( 'welcome_message' ); } |
简单的 加载模板方法,我们看到Welcome 类继承自父类:CI_Controller
我们进入CI_Controller类中查看:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public function __construct(){ self:: $instance =& $this ; foreach (is_loaded() as $var => $class ){ $this -> $var =& load_class( $class ); } $this ->load =& load_class( 'Loader' , 'core' ); $this ->load->initialize(); log_message( 'info' , 'Controller Class Initialized' ); } |
这段构造函数是将,在引导类CodeIgniter.php被实例化化的类赋值到本地类变量中,以构造一个超级对象被使用。同时实现了一个单例 公外部调用。
那是如何赋值的那,这里调用了 common类 中的is_loader()方法。其实就是返回的我们在上面
调用load_class()加载过的类:

最后初始化成功后,会执行CodeIgniter.php文件中的:
1 | call_user_func_array( array (& $CI , $method ), $params ); |
这个函数,从而进入我们welcome控制器的index方法。
大致的流程就是如此,可以根据自己的想法去实现功能,开发有意思的功能模块!!!!