class_core.php是discuz 3.x的核心文件,幾乎所有PHP腳本都有引用此文件初始化論壇運行環境。以下解析引用3.2版discuz。
line 12-15:常數定義
IN_DISCUZ: true //用來防止內部PHP引用檔案直接被呼叫。
DISCUZ_ROOT: E:\project\discuz\ //論壇所在的實體路徑
DISCUZ_CORE_DEBUG: false
line 17: 設定自訂異常處理功能處理方法位於:core::handleException靜態方法。
line 24-30:定義自動載入類別函數 此方法位於:core::autoload($class)
<span style="color: #0000ff;">if</span>(<span style="color: #008080;">function_exists</span>('spl_autoload_register'<span style="color: #000000;">)) { spl_autoload_register(</span><span style="color: #0000ff;">array</span>('core', 'autoload')); <span style="color: #008000;">//</span><span style="color: #008000;">自动加载类函数</span> } <span style="color: #0000ff;">else</span><span style="color: #000000;"> { </span><span style="color: #0000ff;">function</span> __autoload(<span style="color: #800080;">$class</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">return</span> core::autoload(<span style="color: #800080;">$class</span><span style="color: #000000;">); } }</span>
line 33:執行C::createapp()靜態方法.
C::creatapp();
C::createapp()方法不會直接建立discuz_application類別實例,而是透過執行discuz_application::instance()靜態方法間接建立。
discuz_application::instance()靜態方法new一個實例,建構子初始化了論壇環境。 (詳情請看discuz_application.php解析)。
另外,該檔案結尾用簡寫重新定義了類別名稱: line 208-209: C重定義core類別名稱;DB重定義discuz_database類別名稱。
discuz_application.php解析:
line 57-62:建構子對論壇參數的初始化,分別以4個方法實作:
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> __construct() { </span><span style="color: #800080;">$this</span>-><span style="color: #000000;">_init_env(); </span><span style="color: #800080;">$this</span>-><span style="color: #000000;">_init_config(); </span><span style="color: #800080;">$this</span>-><span style="color: #000000;">_init_input(); </span><span style="color: #800080;">$this</span>-><span style="color: #000000;">_init_output(); }</span>
(1)$this->_init_env():
初始化環境變數 line 87-93:常數定義 MAGIC_QUOTES_GPC:true(5.4版以上為false) ICONV_ENABLE:true MB_ENABLE:true EXT_OBGZIP:true TIMESTAMP:當前時間截 並設當前時區為格林尼治時區為格林尼治時區
line 94: 引用核心函式庫:./cource/function/function_core.php。 引用成功並定義常數:DISCUZ_CORE_FUNCTION:true
line 99-104:設定ini:memory_limit:128M line 106:偵測爬蟲:IS_ROBOT:false
line 108-112:清除不必要的全域變數。
<span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$GLOBALS</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$key</span> => <span style="color: #800080;">$value</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">if</span> (!<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$this</span>->superglobal[<span style="color: #800080;">$key</span><span style="color: #000000;">])) { </span><span style="color: #800080;">$GLOBALS</span>[<span style="color: #800080;">$key</span>] = <span style="color: #0000ff;">null</span>; <span style="color: #0000ff;">unset</span>(<span style="color: #800080;">$GLOBALS</span>[<span style="color: #800080;">$key</span><span style="color: #000000;">]); } }</span>
line 114-203:定義全域變數:$_G,物件本身的var屬性也保存一份其引用。
(2)$this->_init_config() 初始化環境:
line 289: 引用./conifg/config_global.php設定參數檔
line 299:偵測並設定$_config['security']['authkey']的值。
<span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$_config</span>['security']['authkey'<span style="color: #000000;">])) { </span><span style="color: #800080;">$_config</span>['security']['authkey'] = <span style="color: #008080;">md5</span>(<span style="color: #800080;">$_config</span>['cookie']['cookiepre'].<span style="color: #800080;">$_config</span>['db'][1]['dbname'<span style="color: #000000;">]); }</span>
line 303-315: 偵測設定參數是否有debug設定參數,若沒有則 定義常數DISCUZ_DEBUG:false,否則設為true。
line 316-317:常數定義:STATICURL:static/,則存入var屬性。
line 319-320: 將所有$_config數組參數,存入:$this->config和$this->var['config']。
line 322: $_config['cookie']['cookiepath']參數值前加/斜線。
line 325: 重新定義$this->var['config']['cookie']['cookiepre']值。
(3)$this->_init_input()初始化輸入
line 236-240: 如果魔術引號功能開啟,則移除$_GET,$_POST,$_COOKIE反斜線;
line 243-246: 根據$this->config['cookie']['cookiepre']值,將帶有此前綴的cookie都存入$this->var['cookie'],key不帶前綴。
line 251-253: POST值合併入GET內;GET值存入$this->var['gp_'.鍵名]中。
line 255-257:$_GET['page']url編碼。
line 259-261: 處理掉無效的$_GET['handlekey'],該值只能含有字母數字和底線。
line 264-268: 將$_GET值存入$this->var['gp_'.鍵名]中,所有值做addslashes引用(即引號和作引用)
line 270-273: 初始化$_GET['mod'],存入$this->var['mod'],mod參數為執行的模組名稱;初始化$_GET['inajax'],存入$ this->var['inajax'],該值判斷請求是否ajax請求; 初始化$_GET['page'],存入$this->var['page'];初始化$this->var['cookie' ]['sid'],存入$this->var['sid'],一般情況為空值。
line 275-278: 如果$this->var['cookie']['saltkey']不存在,則產生該值,並存入cookie,有效期1個月。
line 279: 根據$this->var['cookie']['saltkey']和$this->var['config']['security']['authkey'],產生$this->var ['authkey']值。
(4)$this->_init_output() 初始化輸出:
line 337-342:判斷網頁是否啟用gzip壓縮,設定$this->config['output']['gzip']布林值;並決定設定$_G['gzipcompress']的布林值。
line 344-346: 開啟輸出快取。
line 348-353: 設定$_G['charset']和常數CHARSET的字元編碼值,取值為$this->config['output']['charset']。 將字元編碼輸出於網頁頭部。