首頁  >  文章  >  php教程  >  discuz 3.x 核心檔class_core.php解析

discuz 3.x 核心檔class_core.php解析

WBOY
WBOY原創
2016-08-25 10:20:461372瀏覽

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>
此方法簡述:引用./source/class/資料夾下的類別檔案。方法參數為類別名稱,類別名稱如有_底線,則前綴為子資料夾名稱,後綴為資料夾名稱_類別名稱。 ./source/class/子資料夾/子資料夾名稱_類別範例:$class = "discuz_base",則引用類別檔案為: ./source/class/discuz/discuz_base.php 所有引用過的檔案名稱都儲存在core::imports數組內。

 

line 33:執行C::createapp()靜態方法.

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解析)。

另外,該檔案結尾用簡寫重新定義了類別名稱: 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']。 將字元編碼輸出於網頁頭部。

 

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:下載文件總結下一篇:下載文件總結