目錄結構

下面是 Discuz! 的檔案目錄及對應的描述。日常的開發中主要會涉及到 source 和 template 目錄。雖然目錄和檔案都很多,但是實際上結構還是很清晰,大多數情況下透過檔名和目錄就能知道某個檔案的作用。比如:

	source/class/discuz/discuz_censor.php  用來處理敏感詞過濾的類
	source/function/function_credit.php  處理積分操作的函式庫
	source/module/forum/forum_viewthread.php 處理帖子顯示頁面的模組

另外,source 目錄下的 class 、 function 、 module 、 include 、 admincp 這幾個資料夾下的程式檔案命名要遵守如下規則:檔名字首為所在目錄的名字加上下劃線 (_)
目錄結構詳細:

/┬── api 外部介面
 │      ├── connect	騰訊互聯
 │      ├── db	UCenter 資料庫備份介面
 │      ├── google	Google 引擎使用
 │      ├── javascript	資料和廣告的 JS 呼叫
 │      ├── manyou	manyou 應用及搜尋等相關服務
 │      └── trade	線上支付介面
 ├── archiver	論壇靜態化
 ├── config	站點配置檔案
 ├── data	資料快取及附件
 │      ├── attachment	上傳的檔案目錄
 │      │      ├── album	相簿專用
 │      │      ├── block	DIY 專用
 │      │      ├── common	公共上傳
 │      │      ├── forum	論壇附件專用
 │      │      ├── group	群組圖示和頭部圖片專用
 │      │      ├── portal	門戶上傳檔案專用
 │      │      ├── profile	個人資料專用
 │      │      └── temp	臨時檔案
 │      ├── avatar	影片認證專用
 │      ├── backup	站點資料備份
 │      ├── cache	資料快取
 │      ├── diy	DIY 模組快取
 │      ├── ipdata	Discuz!IP 庫
 │      ├── log	站點日誌,前/後臺管理日誌、錯誤日誌等
 │      ├── plugindata	外掛快取資料
 │      ├── template	模板快取目錄
 │      └── threadcache	帖子快取
 ├── install 安裝目錄
 ├── source 程式碼主目錄
 │      ├── admincp	後臺程式
 │      │      ├── cloud	Discuz! 雲平臺
 │      │      ├── menu	選單
 │      │      └── moderate	稽核功能
 │      ├── archiver	論壇靜態化功能程式碼
 │      ├── class	類檔案目錄
 │      │      ├── adv	站點廣告功能
 │      │      ├── block	DIY 模組功能檔案
 │      │      ├── cache	快取類
 │      │      ├── db	資料庫類
 │      │      ├── discuz	discuz 類
 │      │      ├── forum	論壇
 │      │      ├── helper	存放從 function_core 分離出來的一部分函式
 │      │      ├── lib	工具類的集合類
 │      │      ├── magic	道具
 │      │      ├── memory	記憶體類
 │      │      ├── secqaa	驗證問答
 │      │      ├── table	資料表操作類
 │      │      └── task	站點任務功能
 │      ├── function	函式檔案
 │      │      └── cache	快取功能拆分目錄
 │      ├── include	被包含的檔案
 │      │      ├── collection	淘帖
 │      │      ├── cron	計劃任務
 │      │      ├── misc	雜項
 │      │      ├── modcp	前臺論壇管理
 │      │      ├── portalcp	前臺門戶管理
 │      │      ├── post	帖子相關
 │      │      ├── search	搜尋功能
 │      │      ├── space	家園和個人相關功能
 │      │      ├── spacecp	個人設定相關
 │      │      ├── table	編碼轉換資料
 │      │      ├── thread	檢視主題相關
 │      │      └── topicadmin	前臺主題管理
 │      ├── language	站點語言包
 │      │      ├── adv	廣告
 │      │      ├── block	DIY 模組
 │      │      ├── forum	論壇
 │      │      ├── group	群組
 │      │      ├── home	家園
 │      │      ├── magic	道具
 │      │      ├── member	登入註冊頁面語言
 │      │      ├── mobile	手機訪問功能語言
 │      │      ├── portal	門戶語言
 │      │      ├── ranklist	排行榜語言
 │      │      ├── search	搜尋
 │      │      ├── secqaa	安全問答
 │      │      ├── tag	標籤
 │      │      ├── task	任務
 │      │      └── userapp	manyou 應用
 │      ├── module	功能模組
 │      │      ├── connect	騰訊互聯
 │      │      ├── forum	論壇
 │      │      ├── group	群組
 │      │      ├── home	家園
 │      │      ├── member	登入註冊
 │      │      ├── misc	雜項
 │      │      ├── portal	門戶
 │      │      ├── search	搜尋
 │      │      └── userapp	應用
 │      └── plugin	外掛目錄
 │              ├── cloudstat	Discuz! 雲平臺
 │              ├── myapp	Manyou 應用
 │              ├── myrepeats	馬甲功能
 │              ├── qqconnect	騰訊互聯
 │              └── soso_smilies	騰訊搜搜表情
 ├── static	非 PHP 檔案
 │      ├── image	介面圖片
 │      ├── js	站點 JS 指令碼
 │      ├── space	空間皮膚
 │      └── topic	門戶皮膚
 ├── template	模板目錄
 │      └── default	預設風格
 ├── uc_client	UCenter 客戶端程式
 └── uc_server	UCenter 服務端程式

自動載入

Discuz! X2.5 要求 PHP 版本大於 5.1,拋棄了對 PHP4 的支援,因此支援更多的 PHP 新特性,自動載入類檔案就是其中一個。在 class_core.php 中有這樣一段程式碼:

if(function_exists('spl_autoload_register')) {
	spl_autoload_register(array('core', 'autoload'));
} else {
	function __autoload($class) {
		return core::autoload($class);
	}
}

當呼叫不存在的類的時候就會呼叫 core::autoload 方法來載入相應的類檔案。所以我們在開發的過程中就要用到某個類的時候就不需要 include 或者 require 了。只要對應的類檔案存在,並且命名符合規範,直接呼叫即可。
注意:產品中個別特殊類由於歷史原因無法實現自動載入,需手動處理 include 或 require

class_core.php 流程控制的說明

class_core.php 是入口啟動檔案,主要實現了以下功能:

  • 註冊 autoload 方法和異常處理方法
  • C::t 方法的實現:透過 C::t 方法來呼叫資料層對應表的物件來實現對資料的操作
  • memory 的初始化:主要由 discuz_memory 類來實現
  • 建立 discuz_application 例項 ( discuz_application 是原來 Discuz! X2 的
    discuz_core):進行核心的初始化操作,主要有載入配置檔案、載入環境變數、連線資料庫、載入 setting 資訊、初始化使用者資料、
    session 的初始、計劃任務等
  • 簡寫類的對映:將 class core 對映為 C,discuz_database 對映為 DB,僅為方便使用,程式碼如下
class C extends core {}
class DB extends discuz_database {}