目錄結構
下面是 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 {}