<?php .i,V1A;EjT0//约定:变量后圆括号内为变量的含义,方括号为变量的值 W E,Y0}U"H[01.index.php. %Gk'B/yI+]0P:]yd0 (1),初始化一些系统变量,包括:面向PHPv)N/\Wd,S0E| $system_folder(系统文件夹[system]),面向PHP1?4o$J}#MIs
i0K $application_folder(应用程序文件夹[application])面向PHPY}8V
a"g|}$] (2).定义一些常量,包括: #R_q#I}4j!_+TJ U}0 EXT(文件扩展名[pathinfo(__FILE__, PATHINFO_EXTENSION)]),面向PHPj$A0i,@ t(Dp FCPATH(文件在服务器中的完整路径名[__FILE__]), p4b1Au{2b4z0 SELF(包含扩展名的文件名[pathinfo(__FILE__, PATHINFO_BASENAME)]), cg9n!X$GBn?0 BASEPATH(系统文件夹的路径[$system_folder.'/']),面向PHP%L[
@%CB
o:d APPPATH(程序所在文件夹[$application_folder.'/']),面向PHPy*l0zCT8s*@)s (3).定向至 #\2n6j4j(V0 BASEPATH.'codeigniter/CodeIgniter'.EXT;面向PHPt/aB4wYJQ3D
i"JM (4).结束面向PHP'{:yL-ny3Pm)a:xP ?>面向PHP}8T*f7c@'k <?php 6u2V;`iZyD o8`02.CodeIgniter.php(系统前台控制器,加载基本类和处理请求) m1tXI4mzUN J0 (1),加载全局函数,这些全局函数在后面的加载类和获取配置项方面发挥作用,面向PHP]R7pSr(S require(BASEPATH.'codeigniter/Common'.EXT); ;V~l(|TcCJ0 Common.php中拥有如下函数: ['z!m1v4zDA0 is_really_writable($file);//判断文件是否可写面向PHP}4\
[9}v(`D"U &load_class($class, $instantiate = TRUE)//这个函数利用单件模式,当请求的class不存在时就加载这个类,然后将其设置成一个静态变量,如果已经加载了这个类,则返回这个类的安装变量 !`tQ&U_"g0 //第二个参数指示,是否实例化此类,如果设置为false,则只是包含此类的文件而不进行实例化,返回的值为true/false只是是否加载成功 wSq
OP [-L.Xc)Ixl0 //从libraries中加载类库 T+k9w K*Q)Z0 &get_config()//返回config.php文件中的配置数组面向PHPsB^6Us1FAL7x config_item($item) //获取某个配置项 -U7]"S$V+k Iill0 show_error($message)//显示错误 3tg^!Bho0 show_404($page = '')//显示404错误面向PHPM~A3c2`-g+{ I"s log_message($level = 'error', $message, $php_error = FALSE)//将信息写入日志 1v1Y;s8J/L5ZfH&?5Ic0 _exception_handler($severity, $message, $filepath, $line)//错误处理函数,可以拦截错误并写入到指定的文件中面向PHP#U
`3GoM
d)jh (2),兼容性函数 ,处理一些在某些版本中不存在的函数 "T
^-A1BH4vI
q#g0 require(BASEPATH.'codeigniter/Compat'.EXT); G8}a%`-jp0 Compat.php中存在下列内容: h&F;`B!uB?7o5[ Q0 定义了错误显示级别:define('E_STRICT', 2048);面向PHPP2An1Azw'V 定义了函数:ctype_digit($str)//字符串中只包含数字,否则返回false 7FB(D!Y^K0 定义了函数:ctype_alnum($str);//字符串中只包含数字或者字母,否则返回false x Q
C2W
BA*gW0 (3).加载框架常量 1{N!OW"{e5{*Mq0 require(APPPATH.'config/constants'.EXT); $uk ^F8f;c4Q"aa0 此文件中定义的常量具体见文件中,此处省略面向PHP_1]{a!s (4).设置错误处理,禁用magic_quotes_runtime #@Cc{3_
R0 (5).导入benchmark类,设置断点并调试断点,这个类使你可以设置断点来计算运行时间和消耗的内存 cq([4BziK1W&N0 $BM =& load_class('Benchmark'); DK(f|cDw;B0 Benchmark类中有下列属性和方法:面向PHPO2W"k1n8b5f(a var $marker = array();//断点的数组面向PHP^'[kx^ Zy)@ function mark($name)//设置一个断点,将现在的时间以微秒标识赋值给此变量面向PHPX0@a_#jZ X function elapsed_time($point1 = '', $point2 = '', $decimals = 4)//计算两个断点的间隔时间,如果第一个断点的值为空,则返回一个标签{elapsed_time},在output类中将处理这个标签 5w hh;zuu7t*T&F0 function memory_usage()//返回一个{memory_usage}标签,在output类中将处理这个标签,因为显示整个脚本的消耗内存量才是有意义的面向PHP8h$U1r:^9^"{ (6).加载钩子类,提供了一种机制来扩展基本系统的运行方式,即在某些点插入你自己要运行的脚本,包括诸多可选点面向PHPh*{6n8J&}MC $EXT =& load_class('Hooks');面向PHP.]8N$~
M*a,v| [
[ 此类包含如下的属性和方法:面向PHP9[;Zf#}j9O n var $enabled = FALSE;//是否启用钩子面向PHP8\A
Z8J!TO9O var $hooks = array();//钩子数组 "I,E g*i*[da ]M0 var $in_progress = FALSE;//标识是否正在运行钩子 #m\%d5iFb-HC0 function _initialize()//判断是否启用hooks,如果启用的话就在config/hooks.php中加载hooks,并赋给$hooks属性面向PHP:~;IH3IN @ function _call_hook($which = '')//调用钩子,可以设置的钩子是有限的,见此文件中的类库说明面向PHPj0`ip-t function _run_hook($data)//运行钩子,根据钩子的设置数组来包含文件,实例化类,运行其方法,以及附加属性面向PHP#p]*`4?:FZI ^2n-pl (7).加载并实例化Config类,从config文件夹加载配置文件,也就是允许你在config文件夹中建立自己的配置文件,但是在此文件中必须以$config[""]数组的形式定义配置项 Or UDy0 $CFG =& load_class('Config'); }&u-xq'f3\.`0J7kpy0 此类包含如下属性和方法:面向PHPK];ZBj!Z7qI"M var $config = array();//config数组 D3O8lr9Z^
q8Z2ov0 var $is_loaded = array();//已经加载的配置文件面向PHP
h(j#vPC function CI_Config()//构造函数,获取config.php中的基本config项并赋值给$config属性 8\LmF9M*P3y0 function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)//从config文件夹中加载配置文件(加载成功添加至$is_loaded属性),并加载配置项至$config属性面向PHPB/aR7qc1v~Bj function item($item, $index = '')//返回某个配置项,$index允许配置以二维数组的形式出现,当配置为二维数组的时候,则用$config[$index][$item]面向PHP"s3m{3m^g)dO*EQ;A function slash_item($item)//获取一个配置项,并在其后加上一个"/"符号面向PHPr
px![9X B1@8@{ function site_url($uri = '')//根据config设置将uri转化成完整的url形式面向PHPf/U`4B$xY;v function system_url()//返回系统文件夹的完整路径面向PHP+g7fT | o(X function set_item($item, $value)//设置某个设置项的值,只是设置在属性里,不会更改文件的设置面向PHP0p1qqZ:x.j7?NxWT (8).加载并实例化URI类,此类将截取当前url的参数部分,并分解成控制器以及方法以及参数,供主函数调用 *m O7gK1dp%@1Q0 $URI =& load_class('URI');面向PHP;W"DjY~ Zz)W 此类包含如下属性和方法: DM
NJ4b0 var $keyval = array(); +r2}xK7o0 var $uri_string;//index.php后面的字符串面向PHPP._r;DO var $segments = array(); 1^&G3_NS@c[0 var $rsegments = array();面向PHP{ ozkc,?4L/S
P function _fetch_uri_string()//得到index.php后面的字符串并赋值给属性 $uri_string.面向PHPS
\t]:dO0f function _parse_request_uri()//处理uri中的骚扰字符,使其能正常工作面向PHP0a
r:@6is function _filter_uri($str)//过滤字符串,对特殊字符进行转义面向PHP%t+[tQ
m;eY1F+v function _remove_url_suffix()//如果在配置中设置了伪后缀名,则去掉这个后缀 ;|&fTM:UYD$a#HX0 function _explode_segments()//将字符串按"/"分解到$segments中面向PHP,e!C0?UI kl
t function _reindex_segments()//利用巧妙的方法改变$segments数组的索引,使其索引从1开始,这样更符合直观感受面向PHPRRHHX;~ function segment($n, $no_result = FALSE)//返回指定索引的参数,即$segments[$n]的值面向PHP;x Z*Tz8[C{n&][ function rsegment($n, $no_result = FALSE)//这个函数和上面的函数基本功能一样,不同点在于它允许你在开启CodeIgniter的URI路由功能时进行详细分割并重新分发URI信息
n%r0Y ?"Z7H0 function uri_to_assoc($n = 3, $default = array())//将第三个参数之后的参数以关联数组的方式返回 其中第三个参数是第一个返回数组的key,第四个参数是第一个返回数组的value UR#u?3yw)t0 //以此类推 ~!P4|#E bu"Pj#L0 function ruri_to_assoc($n = 3, $default = array())//同上,只是应用于路由功能 Nu)quyv;T0 function _uri_to_assoc($n = 3, $default = array(), $which = 'segment')//同上 6F^u-t9]*W7{b0 function assoc_to_uri($array)//与上述方法的功能相反 f)S#F;e&m%IIw0 function _slash_segment($n, $where = 'trailing', $which = 'segment')//添加斜线,当$where="trailing"时在末尾添加,="leading"时在开头添加面向PHP p'A
k+NePzf7r7GF function segment_array()//返回$segments面向PHP9sE!S@] e function total_segments()//$segments的总数面向PHP3N [.]U9]C$?\ (9).加载并实例化Router类,这个类处理uri来加载控制器和控制器方法面向PHP"bui3@&i,NG { $RTR =& load_class('Router');面向PHP!b}U6iTl
I%f8Bl 此类包含如下属性和方法: ;ZZ r^
Vk i0 var $config; _6iJ
Y*H*x`!}0 var $routes = array();//路由规则,在routes.php中定义面向PHP$`O^aS;g var $error_routes = array();面向PHP3w0q"w0lg4i.]%A^ var $class = '';面向PHP^~2k;S:R var $method = 'index';面向PHP/g)I*t$HL:| var $directory = ''; w M
F/G4i q0 var $uri_protocol = 'auto'; (kt^i3dC0 var $default_controller;//默认的控制器面向PHP:\*i5`
Ue
Lz/? var $scaffolding_request = FALSE; // Must be set to FALSE面向PHPT:v
P(P3mJ?|!Z|+v function _set_routing()//设置默认的路由信息,如果不存在控制器信息,则根据routes.php的设置来加载默认的控制器,面向PHP/uiwr-b%q
F-x function _set_request($segments = array())//这个方法以一个数组输入来调用set_class和set_method来发送请求 4k)Z&u[6~;K!T0 function _validate_request($segments)//检查是否在uri中包含了文件夹信息,如果包含,则将其值赋给属性$directory 9FFDvv.HD0 function _parse_routes()//处理路由,根据路由设置来
s+g
}I'V0 function set_class($class)//设置控制器类面向PHPHHw oDs Re function fetch_class()面向PHP.S?.dCmx,k(Y_^ function set_method($method)//设置控制器方法 'nx
K TvG?c/x0 function fetch_method()面向PHPYJt.C2{OYw|E function set_directory($dir)//设置文件夹 :n;Nv&}a.L-i0 (10).加载并实例化Output类面向PHP1jF4B-wKe $OUT =& load_class('Output');面向PHPcK3n!h,\!X!Y-[ 此类包含如下的方法和属性: -UQ` euzK$U1E*U0 var $final_output;面向PHP$V6Y:lt(@M9l$` var $cache_expiration = 0;面向PHPK&~c3Xz;E3Wb var $headers = array();面向PHP
ip&]2_#}M'C var $enable_profiler = FALSE; lcp&R$Z[2Pz0 function enable_profiler($val = TRUE)//允许你开启或禁用评测器,评测器将在页的底部显示测试基准点或调试、优化需要的其他数据面向PHP8`Y$p],R
GH3sq8M;k function get_output() ;]7^
X#aPv!S8[0 function set_output($output) IY/Q8?Bs0 function append_output($output)//附加输出的内容面向PHP.d,d X/h2ILfs_Nk function set_header($header, $replace = TRUE)//设置要发送的header到数组属性 $headers {iR.P%S Lu;bq
I0 function set_status_header($code = '200', $text = '')//设置状态码 8fG'z ~7|3OPkx&o0 function cache($time)//设置缓存以及缓存时间 ,以分钟为单位面向PHPNi2OmO2d+rD$SC function _display($output = '')//这个方法将生成并输出至客户端,如果开启了profiler则在页尾添加性能分析结果,如果设置了缓存,则调用缓存文件面向PHPcq*})]IPf`]Y function _write_cache($output)//根据设置的缓存时间写缓存文件 )D.d-Q1S_7\uW0 function _display_cache(&$CFG, &$URI)//显示缓存文件,根据url寻找文件(md5加密形式的文件名),如果存在则显示,如果过期,则删除 O;Q
~.]#j;v0 (11).判断是否存在缓存文件,如果存在则显示,并退出
MKQ,aN-y W.\S\4dh0 (12).加载input类,这个类用来处理过滤用户的输入,防止产生各种攻击 O1c!g_#j7\0 $IN =& load_class('Input'); 2A~*nG%Y.ye
}H0 var $use_xss_clean = FALSE; |+J'R0P{5]F0 var $xss_hash = ''; 7_e1@o.Hu8^0 var $ip_address = FALSE; "y|&`#I+{'OcY _0 var $user_agent = FALSE;面向PHPqg"d$vm var $allow_get_array = FALSE; E4Y,ns?"Q0 var $never_allowed_str = array()//过滤的字符串,详细见类文件定义 'LK5lD'F
D0 var $never_allowed_regex =array()//用正则过滤,详细见类文件定义面向PHP{x4YWv8`H function CI_Input()//构造函数,从配置文件判断是否开启安全功能,然后调用下面的方法面向PHP/p&V-i'pvaY.EB function _sanitize_globals()//清除globals变量,在开启了globals_register的情况下,相当于关闭了此配置项 4RY ?"UU Jr9a4zh8S0 function _clean_input_data($str)//过滤输入的数据 V
x&As#K1fO~c\0 function _clean_input_keys($str)//过滤键值 Jp1H)~`G#Td
F.p-^0 function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE)//从$array获取值,如果设置了xss_clean则过滤之 2Pb6Wn`qV$S0 function get($index = '', $xss_clean = FALSE)//获取过滤后的get数组面向PHPB Pj`!Rf0f8~z function post($index = '', $xss_clean = FALSE)//获取过滤后的post数组 g)Oc(S cO2E0 function get_post($index = '', $xss_clean = FALSE)//获取post数组,如果没有则从get数组获取 H1LR}%NB%l9k8`+_
e)y0 function cookie($index = '', $xss_clean = FALSE)//获取cookie数组 t|
V7vh|!\!c0 function server($index = '', $xss_clean = FALSE)//获取服务器变量数组面向PHP3s9H*ln7j.qQ function ip_address()//获取ip地址面向PHP2YBZb?7z function valid_ip($ip)//验证ip地址 Yre_#e0 function filename_security($str)//过滤文件名中的隐患面向PHP?A:~{)jzx ~ function xss_clean($str, $is_image = FALSE)//执行各种xss过滤面向PHP
CE~zls function _remove_invisible_characters($str)//移除不可见的符号 ,n
h.@Vt
`9n0 省略了一系列xss_clean中的回调函数,对输入执行各种安全过滤 sc2@.hA(I0 (13).加载language类 P2X(GNMAT0 $LANG =& load_class('Language');面向PHPwv~xOC 省略此类的描述 S,w9lV-K0T-u(V(y+?0 (14).加载controller类面向PHP'RM1O]h%l load_class('Controller', FALSE); lD.r5L-{y2g,p N5{0 只包含此文件而不实例化此类面向PHP?8] {D@/k H| f 如果php版本小于5则加载loader类 sL|#WE"k4E-jOn6i0 (15).根据uri来在controller文件夹中寻找控制器类和方法,如果找不到则退出,找到则包含文件面向PHPG2xtTpwS#O $class = $RTR->fetch_class();//获取请求的类面向PHP#pgHNuK"}C $method = $RTR->fetch_method();//获取请求的方法 eoW j}R$VvZ0 (16). i-po9uD)nDPf0 (17).$CI = new $class();//加载超类,超类是以控制器中的类为基础创建的面向PHPm1?m yr;Y4V:^ 判断是否是附带脚手架的请求面向PHPk&@A%Q:k%r ]`$vF (18)Controller类的结构:此类继承自CI_Base类面向PHP3EA
J/Z+Vd var $_ci_scaffolding = FALSE; |6Dp0e;^Sv3h;z0 var $_ci_scaff_table = FALSE;面向PHP K(y2e_R,}:@~a function Controller()//构造函数,执行parent::CI_Base();$this->_ci_initialize(); -I rh3H/p0 function _ci_initialize()//在此将所有的基本类都加在为这个类的变量,使本类成为一个超级类,并且加载load类来加载视图和模型等 5TcK;X nq:^&cC0 function _ci_scaffolding()//执行脚手架 U,v[
B {{0 (19).如果使用了数据库 则关闭数据库面向PHP
UaS7?XpE.`.Ck 面向PHP/A~}!De"N
lNm;mZ*`a!\.V0面向PHPX;Fp`:TnM#t 面向PHPZ$wAI;SM]
9On{7x#xS0面向PHPZ~9DzG6YM!jx
6auJxJE0 b,\
i M.S
i@0面向PHP\1BJH2xmF*~
.q!W._0O-hjn*gR0面向PHPv1ul8i$[3o V2Dj#w]
n
c*y(QN2_t0 8]mPY#Mut]`0 5nAtj.lP(R'p]o9Y)d0面向PHPk7k4][:N1T,v4P9}*Y 面向PHP"f5xIZ5T0i
#H|
T5hmo sJ0面向PHPy:DT3Bx9B
m'c5Qs]"W$d'z)f0面向PHPKT7hE
|m/|\ 面向PHP-^b6r] p]gW3dI 面向PHPx%A:T5^hK3z;M
:I E;V{^ eVI|Gv0?> |