discuz 3.2之class_core.php解析

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']。 將字符編碼輸出於網頁頭部。

相關文章
相關標籤/搜索