您现在的位置是:首页 > cms教程 > Discuz教程Discuz教程
discuz 3.x文件class_core.php分析
晓亦2025-07-03Discuz教程已有人查阅
导读class_core.php是discuz 3.x的核心文件,几乎所有PHP脚本都有引用此文件初始化论坛运行环境。以下解析引用3.2版discuz。
class_core.php是discuz 3.x的核心文件,几乎所有PHP脚本都有引用此文件初始化论坛运行环境。以下解析引用3.2版discuz。
line 12-15:常量定义
处理方法位于:core::handleException静态方法。
line 24-30:定义自动加载类函数 该方法位于:
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解析:
该类位于./source/class/discuz/discuz_application.php,被core对象间接实例化。该类有两个最重要的方法,一个是构造函数,一个是init方法。
构造函数解析:
line 57-62:构造函数对论坛参数的初始化,分别用4个方法实施:
初始化环境变量 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:清除不必要的全局变量。
(2)$this->_init_config() 初始化环境:
line 289: 引用./conifg/config_global.php配置参数文件
line 299:检测并设定
line 316-317:常量定义:STATICURL:static/,则存入var属性。
line 319-320: 将所有$_config数组参数,存入:
line 325: 重定义
(3)$this->_init_input()初始化输入
line 236-240: 如果魔术引号功能开启,则去除$_GET,$_POST,$_COOKIE反斜线;
line 243-246: 根据
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'],存入
line 275-278: 如果
line 279: 根据
(4)$this->_init_output() 初始化输出:
line 337-342:判断网页是否启用gzip压缩,设定
该方法也主要初始化论坛环境,准备好相关的数据库连接类、设置、用户、会话等等相关参数。
(1)$this->init_db():
line 12-15:常量定义
IN_DISCUZ: true //用于防止内部PHP引用文件被直接调用。
DISCUZ_ROOT: E:\\project\\discuz\\ //论坛所在的物理路径
DISCUZ_CORE_DEBUG: false //核心代码是否测试模式
DISCUZ_TABLE_EXTENDABLE: false //未知
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数组内。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解析:
该类位于./source/class/discuz/discuz_application.php,被core对象间接实例化。该类有两个最重要的方法,一个是构造函数,一个是init方法。
构造函数解析:
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']
的布尔值。
if(!empty($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') === false) {
$this->config['output']['gzip'] = false;
}
$allowgzip = $this->config['output']['gzip'] && empty($this->var['inajax']) && $this->var['mod'] != 'attachment' && EXT_OBGZIP;
setglobal('gzipcompress', $allowgzip);
line 344-346: 开启输出缓存。
if(!ob_start($allowgzip ? 'ob_gzhandler' : null)) {
ob_start();
}
line 348-353: 设定$_G['charset']和常量CHARSET的字符编码值,取值于
$this->config['output']['charset']
将字符编码输出于网页头部。
setglobal('charset', $this->config['output']['charset']);
define('CHARSET', $this->config['output']['charset']);
//默认输出字符编码标识
if($this->config['output']['forceheader']) {
@header('Content-Type: text/html; charset='.CHARSET);
}
discuz_application::init()方法解析:该方法也主要初始化论坛环境,准备好相关的数据库连接类、设置、用户、会话等等相关参数。
(1)$this->init_db():
private function _init_db() {
if($this->init_db) {
$driver = function_exists('mysql_connect') ? 'db_driver_mysql' : 'db_driver_mysqli';
if(getglobal('config/db/slave')) {
$driver = function_exists('mysql_connect') ? 'db_driver_mysql_slave' : 'db_driver_mysqli_slave';
}
DB::init($driver, $this->config['db']);
}
}
DB类位于./source/class/discuz_database.php,实际上就是discuz_database类。DB::init()根据参数配置实例化mysql连接类。
本文标签:
很赞哦! ()
相关教程
图文教程
discuz优化技巧分享
Discuz论坛是国内使用最多的论坛系统,现在较新版为X3.4,X3.4从2018年1月1日起只在官方Git发布,说明已经开源了。discuz有那么多的粉丝,跟它完善的功能有很大关系
discuz登录流程分析
discuz登录流程解析,最近在研究,Ucenter的同步登陆机制,就先从discuz的登录开始了处理脚本source/module/member/member_logging.php
discuz的uc密码忘记了怎么修改
朋友一个网站的密码忘记了,叫我帮他修改,用的是discuz x2.5也是较新的论坛系统,这个我以前很少用,也没怎么接触,第一当然我就是首先去修改mysql数据库
不同版本MySQL数据库与Discuz安装兼容性
在当今互联网时代,搭建一个论坛平台不仅仅是技术的展示,更是社区运营的核心。Discuz作为一个广受欢迎的开源论坛系统,其与MySQL数据库的兼容性问题常常成为用户关注的焦点。
相关源码
-
(自适应响应式)html5蓝色智能水表营销型网站pbootcms模板下载PbootCMS内核开发,为智能水表企业打造的营销型网站解决方案,本模板基于PbootCMS内核开发,为智能水表及相关行业企业设计,采用HTML5+CSS3技术构建,具有响应式布局。查看源码 -
(自适应响应式)化妆美容口红唇膏化妆品模板pbootcms源码下载基于PbootCMS开发的响应式模板,为化妆品品牌、美容机构打造,通过优雅的视觉呈现提升产品展示效果与品牌调性。采用时尚杂志排版风格,色卡系统规范产品展示。微交互动画增强用户体验,智能推荐算法提升产品关联展示效果。查看源码 -
(PC+WAP)门窗门业家居定制铝合金产品pbootcms模板下载基于PbootCMS内核开发的门窗门业企业专用模板,采用响应式设计结构,数据一次录入即可同步适配电脑与手机端浏览。通过简洁大气的视觉呈现,帮助门窗企业快速建立专业线上展示平台,有效传递产品价值与服务优势。查看源码 -
WordPress个人博客主题 - wp-Concise-v1.0免费下载wp-Concise-v1.0是一款专为个人博客设计的简约风格主题,采用全宽排版设计理念,注重内容呈现效果。该模板适用于个人随笔、技术分享、生活记录等博客场景,帮助用户打造专业的内容展示空间。查看源码 -
(自适应)英文绿色精密模具零件加工五金零件pbootcms外贸网站模板本模板基于PbootCMS开发,为五金零件、精密模具加工等英文外贸企业设计。采用响应式布局,适配各类移动设备,是五金零件企业开展国际贸易的专业展示平台。查看源码 -
(PC+WAP)货运物流快递仓储货架pbootcms网站模板下载本模板基于PbootCMS开发,为货运物流、快递配送、仓储货架等行业设计,支持PC+WAP自适应,确保在电脑、手机、平板等设备上均能流畅访问。适用于物流公司、仓储企业查看源码
| 分享笔记 (共有 篇笔记) |