您现在的位置是:首页 > 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连接类。
本文标签:
很赞哦! ()
相关教程
图文教程
LAMP+discuz网站搭建步骤
网上下载centOS7 64的镜像,然后在vmware里面配置好,我配置的是linux终端桌面,运行快,占内存小。
Discuz模板语法介绍
PHP中使用template()函数显示已存在模板在Discuz!程序执行中可以通过 include template('模板文件夹/模板名称无后缀');的方式进行解析
discuz门户首页header模板语法详解和注释
header文件引用了跟多通用模板,所以整个文章会很长,现在比较忙,注释工作会不定期进行首先开下门户首页的文件portal里面的index.htmcommon文件下的header_开头的几个文件header.htm
Discuz XSS得webshell漏洞原因和修复方法
受影响版本:Discuz<6.1.0,gbk+utf+big5;3天前有朋友在论坛问过,说Discuz有个非论坛创始人获得WEBSHELL的漏洞,是superhei早前发出来的一大堆DISCUZ漏洞之一
相关源码
-
(自适应手机端)英文外贸电子产品通用pbootcms模板源码下载为电子产品外贸企业设计的响应式网站模板,采用PbootCMS开发内核,支持多语言展示。模板默认集成产品展示系统、询价表单模块和企业资质展示区,满足跨境贸易基础需求。整站采用模块化设计,便于扩展业务场景。查看源码 -
自适应响应式绿色装修公司定制家居类pbootcms网站下载(自适应手机端)响应式全屋装修定制家居类网站pbootcms模板 绿色装修公司网站源码下载PbootCMS内核开发的网站模板,该模板适用于装修定制网站、装查看源码 -
(自适应响应式)动力刀座五金机械设备pbootcms网站源码下载为动力刀座及五金机械企业定制的响应式网站框架,基于PbootCMS系统深度开发,助力传统制造企业实现数字化转型升级。采用手工编写的DIV+CSS前端架构,代码执行效率提升40%。查看源码 -
(PC+WAP)五金机械设备营销型模板下载带在线留言为机械设备制造商设计的营销型模板,集成产品参数对比系统、产品展示模块和询价管理功能。采用PbootCMS开发内核,PHP7+运行环境。手工编写语义化HTML5结构,CSS3动画优化交互体验。查看源码 -
(PC+WAP)货物运输快递物流汽车贸易pbootcms模板下载为货运代理、汽车贸易及快递企业设计的全终端适配网站系统,整合运单追踪与车辆展示核心功能模块原生开发的DIV+CSS架构,支持WebP图像压缩技术。查看源码 -
(PC+WAP)楼承板建筑工程合金钢铁材料pbootcms网站源码下载为楼承板生产商及建筑工程企业设计的响应式网站模板,采用PbootCMS内核开发,同步适配电脑与移动设备浏览。通过模块化结构展示工程案例、产品参数等专业内容,帮助建筑建材企业建立标准化数字展示平台,提升行业专业形象。查看源码
| 分享笔记 (共有 篇笔记) |
