目录结构
下面是 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 {}