class_core.php是discuz 3.x的核心文件,幾乎全部PHP腳本都有引用此文件初始化論壇運行環境。如下解析引用3.2版discuz。php
line 12-15:常量定義
IN_DISCUZ: true //用於防止內部PHP引用文件被直接調用。
DISCUZ_ROOT: E:\\project\\discuz\\ //論壇所在的物理路徑
DISCUZ_CORE_DEBUG: false //核心代碼是否測試模式
DISCUZ_TABLE_EXTENDABLE: false //未知ajax
line 17: 設置自定義異常處理功能
處理方法位於:core::handleException靜態方法。數組
line 24-30:定義自動加載類函數 該方法位於:core::autoload($class)緩存
if(function_exists('spl_autoload_register')) { spl_autoload_register(array('core', 'autoload')); //自動加載類函數 } else { function __autoload($class) { return core::autoload($class); } }
該方法簡述:引用./source/class/文件夾下的類文件。方法參數爲類名稱,類名稱若有_下劃線,則前綴爲子文件夾名稱,後綴爲文件夾名_類名。 ./source/class/子文件夾/子文件夾名_類 例:$class = "discuz_base",則引用類文件爲: ./source/class/discuz/discuz_base.php 全部引用過的文件名都存儲在core::imports數組內。cookie
line 33:執行C::createapp()靜態方法.app
C::creatapp();
該方法爲最重要的方法,是初始化論壇的方法,該方法建立discuz_application類對象,使用單一工廠模式。 discuz_application類位於: ./source/class/discuz/discuz_application.php函數
C::createapp()方法不直接建立discuz_application類實例,而是經過執行discuz_application::instance()靜態方法間接建立。測試
discuz_application::instance()靜態方法new一個實例,構造函數初始化了論壇環境。(詳情請看discuz_application.php解析)。this
另外,該文件結尾用簡寫重定義了類名: line 208-209: C重定義core類名; DB重定義discuz_database類名。編碼
discuz_application.php解析:
line 57-62:構造函數對論壇參數的初始化,分別用4個方法實施:
public function __construct() { $this->_init_env(); $this->_init_config(); $this->_init_input(); $this->_init_output(); }
(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:清除沒必要要的全局變量。
foreach ($GLOBALS as $key => $value) { if (!isset($this->superglobal[$key])) { $GLOBALS[$key] = null; unset($GLOBALS[$key]); } }
line 114-203:定義全局變量:$_G,對象自己的var屬性也保存一份其引用。
(2)$this->_init_config() 初始化環境:
line 289: 引用./conifg/config_global.php配置參數文件
line 299:檢測並設定$_config['security']['authkey']的值。
if(empty($_config['security']['authkey'])) { $_config['security']['authkey'] = md5($_config['cookie']['cookiepre'].$_config['db'][1]['dbname']); }
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']。 將字符編碼輸出於網頁頭部。