程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> php框架codeigniter框架源代碼分析,注釋中文化,類庫分析(一)

php框架codeigniter框架源代碼分析,注釋中文化,類庫分析(一)

編輯:PHP綜合

最近這幾天決定看 ci框架的源代碼的,因為它是輕量級的,代碼文件的結構比較清晰,又index.php作為 入口,在codeigniter.php文件中加載所有的基礎類,於是我挨個類滴看下去,並且在看的時候分析了每一步 關鍵的進程,而且對原來的英文注釋進行了翻譯,現在主要文件已經翻譯完成,稍候會翻譯並分析一些其他 的重要的類,敬請期待

這裡的是 它的詳細的執行過程,從入口到最後結束,進行了完整的記錄,大家先看著,其他的分析,例 如,CI超類的結構,如何實現MVC模式,數據庫類的實現,xss過濾類的詳細分析等等內容以後陸續會登陸

出處:http://www.cnblogs.com/mier

從這裡下載源文件:http://files.cnblogs.com/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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved