php框架codeigniter框架源代码分析,注释中文化,类库分析(一)

最近这几天决定看 ci框架的源代码的,因为它是轻量级的,代码文件的结构比较清晰,又index.php作为入口,在codeigniter.php文件中加载所有的基础类,于是我挨个类滴看下去,并且在看的时候分析了每一步关键的进程,而且对原来的英文注释进行了翻译,现在主要文件已经翻译完成,稍候会翻译并分析一些其他的重要的类,敬请期待


这里的是 它的详细的执行过程,从入口到最后结束,进行了完整的记录,大家先看着,其他的分析,例如,CI超类的结构,如何实现MVC模式,数据库类的实现,xss过滤类的详细分析等等内容以后陆续会登陆

 

版权声明 本博客(小MM)所有文章均为原创,如果你对本博客的文章感兴趣,可以留下你的QQ或者加本人的QQ:676588498,如果转载本博客的文章,请注明出处,并附加说明和连接(http://www.cnblogs.com/mier),谢谢支持哦

 从这里下载源文件:/Files/mier/ci的执行流程.txt 下载后把文件后缀改为 .php即可正常在ide里浏览

 

  1  <? php
  2  // 约定:变量后圆括号内为变量的含义,方括号为变量的值
  3  1 . index . php .
  4      ( 1 ) , 初始化一些系统变量 , 包括 :
  5                   $system_folder (系统文件夹[ system ]) ,
  6                   $application_folder (应用程序文件夹[application])
  7      ( 2 ) . 定义一些常量 , 包括 :
  8                  EXT(文件扩展名[ pathinfo ( __FILE__ ,  PATHINFO_EXTENSION)]) ,
  9                  FCPATH(文件在服务器中的完整路径名[ __FILE__ ]) ,
 10                  SELF(包含扩展名的文件名[ pathinfo ( __FILE__ ,  PATHINFO_BASENAME)]) ,
 11                  BASEPATH(系统文件夹的路径[ $system_folder . ' / ' ]) ,
 12                  APPPATH(程序所在文件夹[ $application_folder . ' / ' ]) ,
 13       ( 3 ) . 定向至
 14                  BASEPATH . ' codeigniter/CodeIgniter ' . EXT;
 15       ( 4 ) . 结束
 16  ?>
 17  <? php
 18  2 . CodeIgniter . php(系统前台控制器 , 加载基本类和处理请求)
 19      ( 1 ) , 加载全局函数 , 这些全局函数在后面的加载类和获取配置项方面发挥作用 ,
 20                    require (BASEPATH . ' codeigniter/Common ' . EXT);
 21                   Common . php中拥有如下函数 :
 22                          is_really_writable( $file ); // 判断文件是否可写
 23                           & load_class( $class ,   $instantiate   =   TRUE ) // 这个函数利用单件模式,当请求的class不存在时就加载这个类,然后将其设置成一个静态变量,如果已经加载了这个类,则返回这个类的安装变量
 24                                                                                        //第二个参数指示,是否实例化此类,如果设置为false,则只是包含此类的文件而不进行实例化,返回的值为true/false只是是否加载成功
 25                                                                                        //从libraries中加载类库
 26                           & get_config() // 返回config.php文件中的配置数组
 27                          config_item( $item // 获取某个配置项
 28                          show_error( $message ) // 显示错误
 29                          show_404( $page   =   '' ) // 显示404错误
 30                          log_message( $level   =   ' error ' ,   $message ,   $php_error   =   FALSE ) // 将信息写入日志
 31                          _exception_handler( $severity ,   $message ,   $filepath ,   $line ) // 错误处理函数,可以拦截错误并写入到指定的文件中
 32       ( 2 ) , 兼容性函数  , 处理一些在某些版本中不存在的函数
 33                    require (BASEPATH . ' codeigniter/Compat ' . EXT);
 34                   Compat . php中存在下列内容 :
 35                          定义了错误显示级别 : define ( ' E_STRICT ' ,   2048 );
 36                          定义了函数 : ctype_digit ( $str ) // 字符串中只包含数字,否则返回false
 37                          定义了函数 : ctype_alnum ( $str ); // 字符串中只包含数字或者字母,否则返回false
 38       ( 3 ) . 加载框架常量
 39                   require (APPPATH . ' config/constants ' . EXT);
 40                  此文件中定义的常量具体见文件中 , 此处省略
 41       ( 4 ) . 设置错误处理 , 禁用magic_quotes_runtime
 42       ( 5 ) . 导入benchmark类 , 设置断点并调试断点 , 这个类使你可以设置断点来计算运行时间和消耗的内存
 43                   $BM   =&  load_class( ' Benchmark ' );
 44                  Benchmark类中有下列属性和方法 :
 45                           var   $marker   =   array (); // 断点的数组
 46                           function  mark( $name ) // 设置一个断点,将现在的时间以微秒标识赋值给此变量
 47                           function  elapsed_time( $point1   =   '' ,   $point2   =   '' ,   $decimals   =   4 ) // 计算两个断点的间隔时间,如果第一个断点的值为空,则返回一个标签{elapsed_time},在output类中将处理这个标签
 48                           function  memory_usage() // 返回一个{memory_usage}标签,在output类中将处理这个标签,因为显示整个脚本的消耗内存量才是有意义的
 49       ( 6 ) . 加载钩子类 , 提供了一种机制来扩展基本系统的运行方式 , 即在某些点插入你自己要运行的脚本 , 包括诸多可选点
 50                   $EXT   =&  load_class( ' Hooks ' );
 51                   此类包含如下的属性和方法 :
 52                           var   $enabled           =   FALSE ; // 是否启用钩子
 53                           var   $hooks             =   array (); // 钩子数组
 54                           var   $in_progress      =   FALSE ; // 标识是否正在运行钩子
 55                           function  _initialize() // 判断是否启用hooks,如果启用的话就在config/hooks.php中加载hooks,并赋给$hooks属性
 56                           function  _call_hook( $which   =   '' ) // 调用钩子,可以设置的钩子是有限的,见此文件中的类库说明
 57                           function  _run_hook( $data ) // 运行钩子,根据钩子的设置数组来包含文件,实例化类,运行其方法,以及附加属性
 58       ( 7 ) . 加载并实例化Config类 , 从config文件夹加载配置文件 , 也就是允许你在config文件夹中建立自己的配置文件 , 但是在此文件中必须以 $config [ "" ]数组的形式定义配置项
 59                   $CFG   =&  load_class( ' Config ' );
 60                  此类包含如下属性和方法 :
 61                           var   $config   =   array (); // config数组
 62                           var   $is_loaded   =   array (); // 已经加载的配置文件
 63                           function  CI_Config() // 构造函数,获取config.php中的基本config项并赋值给$config属性
 64                           function  load( $file   =   '' ,   $use_sections   =   FALSE ,   $fail_gracefully   =   FALSE ) // 从config文件夹中加载配置文件(加载成功添加至$is_loaded属性),并加载配置项至$config属性
 65                           function  item( $item ,   $index   =   '' ) // 返回某个配置项,$index允许配置以二维数组的形式出现,当配置为二维数组的时候,则用$config[$index][$item]
 66                           function  slash_item( $item ) // 获取一个配置项,并在其后加上一个"/"符号
 67                           function  site_url( $uri   =   '' ) // 根据config设置将uri转化成完整的url形式
 68                           function  system_url() // 返回系统文件夹的完整路径
 69                           function  set_item( $item ,   $value ) // 设置某个设置项的值,只是设置在属性里,不会更改文件的设置
 70       ( 8 ) . 加载并实例化URI类 , 此类将截取当前url的参数部分 , 并分解成控制器以及方法以及参数 , 供主函数调用
 71                   $URI   =&  load_class( ' URI ' );
 72                  此类包含如下属性和方法 :
 73                           var      $keyval      =   array ();
 74                           var   $uri_string ; // index.php后面的字符串
 75                           var   $segments          =   array ();
 76                           var   $rsegments          =   array ();
 77                           function  _fetch_uri_string() // 得到index.php后面的字符串并赋值给属性 $uri_string.
 78                           function  _parse_request_uri() // 处理uri中的骚扰字符,使其能正常工作
 79                           function  _filter_uri( $str ) // 过滤字符串,对特殊字符进行转义
 80                           function  _remove_url_suffix() // 如果在配置中设置了伪后缀名,则去掉这个后缀
 81                           function  _explode_segments() // 将字符串按"/"分解到$segments中
 82                           function  _reindex_segments() // 利用巧妙的方法改变$segments数组的索引,使其索引从1开始,这样更符合直观感受
 83                           function  segment( $n ,   $no_result   =   FALSE ) // 返回指定索引的参数,即$segments[$n]的值
 84                           function  rsegment( $n ,   $no_result   =   FALSE ) // 这个函数和上面的函数基本功能一样,不同点在于它允许你在开启CodeIgniter的URI路由功能时进行详细分割并重新分发URI信息
 85                           function  uri_to_assoc( $n   =   3 ,   $default   =   array ()) // 将第三个参数之后的参数以关联数组的方式返回 其中第三个参数是第一个返回数组的key,第四个参数是第一个返回数组的value
 86                                                                                                      //以此类推
 87                           function  ruri_to_assoc( $n   =   3 ,   $default   =   array ()) // 同上,只是应用于路由功能
 88                           function  _uri_to_assoc( $n   =   3 ,   $default   =   array () ,   $which   =   ' segment ' ) // 同上
 89                           function  assoc_to_uri( $array ) // 与上述方法的功能相反
 90                           function  _slash_segment( $n ,   $where   =   ' trailing ' ,   $which   =   ' segment ' ) // 添加斜线,当$where="trailing"时在末尾添加,="leading"时在开头添加
 91                           function  segment_array() // 返回$segments
 92                           function  total_segments() // $segments的总数
 93      ( 9 ) . 加载并实例化Router类 , 这个类处理uri来加载控制器和控制器方法
 94                   $RTR   =&  load_class( ' Router ' );
 95                   此类包含如下属性和方法 :
 96                           var   $config ;
 97                           var   $routes           =   array (); // 路由规则,在routes.php中定义
 98                           var   $error_routes      =   array ();
 99                           var   $class              =   '' ;
100                           var   $method              =   ' index ' ;
101                           var   $directory          =   '' ;
102                           var   $uri_protocol       =   ' auto ' ;
103                           var   $default_controller ; // 默认的控制器
104                           var   $scaffolding_request   =   FALSE //  Must be set to FALSE
105                           function  _set_routing() // 设置默认的路由信息,如果不存在控制器信息,则根据routes.php的设置来加载默认的控制器,
106                           function  _set_request( $segments   =   array ()) // 这个方法以一个数组输入来调用set_class和set_method来发送请求
107                           function  _validate_request( $segments ) // 检查是否在uri中包含了文件夹信息,如果包含,则将其值赋给属性$directory
108                           function  _parse_routes() // 处理路由,根据路由设置来
109                           function  set_class( $class ) // 设置控制器类
110                           function  fetch_class()
111                           function  set_method( $method ) // 设置控制器方法
112                           function  fetch_method()
113                           function  set_directory( $dir ) // 设置文件夹
114       ( 10 ) . 加载并实例化Output类
115                   $OUT   =&  load_class( ' Output ' );
116                  此类包含如下的方法和属性 :
117                           var   $final_output ;
118                           var   $cache_expiration      =   0 ;
119                           var   $headers               =   array ();
120                           var   $enable_profiler       =   FALSE ;
121                           function  enable_profiler( $val   =   TRUE ) // 允许你开启或禁用评测器,评测器将在页的底部显示测试基准点或调试、优化需要的其他数据
122                           function  get_output()
123                           function  set_output( $output )
124                           function  append_output( $output ) // 附加输出的内容
125                           function  set_header( $header ,   $replace   =   TRUE ) // 设置要发送的header到数组属性 $headers
126                           function  set_status_header( $code   =   ' 200 ' ,   $text   =   '' ) // 设置状态码
127                           function  cache( $time ) // 设置缓存以及缓存时间 ,以分钟为单位
128                           function  _display( $output   =   '' ) // 这个方法将生成并输出至客户端,如果开启了profiler则在页尾添加性能分析结果,如果设置了缓存,则调用缓存文件
129                           function  _write_cache( $output ) // 根据设置的缓存时间写缓存文件
130                           function  _display_cache( & $CFG ,   & $URI ) // 显示缓存文件,根据url寻找文件(md5加密形式的文件名),如果存在则显示,如果过期,则删除
131       ( 11 ) . 判断是否存在缓存文件 , 如果存在则显示 , 并退出
132       ( 12 ) . 加载input类 , 这个类用来处理过滤用户的输入 , 防止产生各种攻击
133                    $IN          =&  load_class( ' Input ' );
134                            var   $use_xss_clean          =   FALSE ;
135                           var   $xss_hash              =   '' ;
136                           var   $ip_address              =   FALSE ;
137                           var   $user_agent              =   FALSE ;
138                           var   $allow_get_array      =   FALSE ;
139                            var   $never_allowed_str   =   array () // 过滤的字符串,详细见类文件定义
140                            var   $never_allowed_regex   = array () // 用正则过滤,详细见类文件定义
141                            function  CI_Input() // 构造函数,从配置文件判断是否开启安全功能,然后调用下面的方法
142                            function  _sanitize_globals() // 清除globals变量,在开启了globals_register的情况下,相当于关闭了此配置项
143                            function  _clean_input_data( $str ) // 过滤输入的数据
144                            function  _clean_input_keys( $str ) // 过滤键值
145                            function  _fetch_from_array( & $array ,   $index   =   '' ,   $xss_clean   =   FALSE ) // 从$array获取值,如果设置了xss_clean则过滤之
146                            function  get( $index   =   '' ,   $xss_clean   =   FALSE ) // 获取过滤后的get数组
147                            function  post( $index   =   '' ,   $xss_clean   =   FALSE ) // 获取过滤后的post数组
148                            function  get_post( $index   =   '' ,   $xss_clean   =   FALSE ) // 获取post数组,如果没有则从get数组获取
149                            function  cookie( $index   =   '' ,   $xss_clean   =   FALSE ) // 获取cookie数组
150                            function  server( $index   =   '' ,   $xss_clean   =   FALSE ) // 获取服务器变量数组
151                            function  ip_address() // 获取ip地址
152                            function  valid_ip( $ip ) // 验证ip地址
153                            function  filename_security( $str ) // 过滤文件名中的隐患
154                            function  xss_clean( $str ,   $is_image   =   FALSE ) // 执行各种xss过滤
155                            function  _remove_invisible_characters( $str ) // 移除不可见的符号
156                           省略了一系列xss_clean中的回调函数 , 对输入执行各种安全过滤
157       ( 13 ) . 加载language类
158                    $LANG      =&  load_class( ' Language ' );
159                   省略此类的描述
160       ( 14 ) . 加载controller类
161                   load_class( ' Controller ' ,   FALSE );
162                   只包含此文件而不实例化此类
163                   如果php版本小于5则加载loader类
164       ( 15 ) . 根据uri来在controller文件夹中寻找控制器类和方法 , 如果找不到则退出 , 找到则包含文件
165                    $class    =   $RTR -> fetch_class(); // 获取请求的类
166                   $method   =   $RTR -> fetch_method(); // 获取请求的方法
167       ( 16 ) .
168       ( 17 ) . $CI   =   new   $class (); // 加载超类,超类是以控制器中的类为基础创建的
169               判断是否是附带脚手架的请求
170       ( 18 )Controller类的结构 : 此类继承自CI_Base类
171                            var   $_ci_scaffolding      =   FALSE ;
172                           var   $_ci_scaff_table      =   FALSE ;
173                           function  Controller() // 构造函数,执行parent::CI_Base();$this->_ci_initialize();
174                           function  _ci_initialize() // 在此将所有的基本类都加在为这个类的变量,使本类成为一个超级类,并且加载load类来加载视图和模型等
175                           function  _ci_scaffolding() // 执行脚手架
176       ( 19 ) . 如果使用了数据库 则关闭数据库
177 
178 
179 

你可能感兴趣的:(CodeIgniter)