分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

【discuzX2】/source/class/class_core.php文件中核心基础类库中discuz_core类分析

发布时间:2023-09-06 01:09责任编辑:傅花花关键词:class类库
  1. <?php
  2. /**
  3. *[Discuz!](C)2001-2099ComsenzInc.
  4. *ThisisNOTafreeware,useissubjecttolicenseterms
  5. *
  6. *$Id:class_core.php244872011-09-2108:13:57Zmonkey$
  7. */
  8. define(‘IN_DISCUZ‘,true);//禁止用户直接通过路径访问
  9. error_reporting(0);//设置错误级别
  10. //通用基础类
  11. classdiscuz_core{
  12. var$db=null;//数据库db类实例化对象
  13. var$mem=null;//memcached缓存对象
  14. var$session=null;//session变量
  15. var$config=array();//配置信息
  16. //$_G数组的映射
  17. var$var=array();//变量数组,将超级全局变量$_G的引用赋值给了$var变量
  18. //加载缓存数组
  19. var$cachelist=array();//缓存列表
  20. //是否初始化
  21. var$init_setting=true;//初始化设置
  22. var$init_user=true;//初始化用户信息
  23. var$init_session=true;//初始化session信息
  24. var$init_cron=true;
  25. var$init_misc=true;
  26. var$init_memory=true;//初始化内存情况
  27. var$init_mobile=true;
  28. //是否已经初始化
  29. var$initated=false;//初始化工作为完成标志
  30. //列举全局变量,为清理做准备
  31. var$superglobal=array(//自定义超级全局变量
  32. ‘GLOBALS‘=>1,
  33. ‘_GET‘=>1,
  34. ‘_POST‘=>1,
  35. ‘_REQUEST‘=>1,
  36. ‘_COOKIE‘=>1,
  37. ‘_SERVER‘=>1,
  38. ‘_ENV‘=>1,
  39. ‘_FILES‘=>1,
  40. );
  41. //建立唯一的进程
  42. function&instance(){//单例模式实例化一个discuz_core核心类实例化对象
  43. static$object;
  44. if(empty($object)){
  45. $object=newdiscuz_core();//实例化一个discuz_core对象
  46. }
  47. return$object;//返回唯一的一个discuz_core类实例化对象
  48. }
  49. //预处理的调用
  50. functiondiscuz_core(){//构造函数
  51. $this->_init_env();//初始化环境变量
  52. $this->_init_config();//初始化配置变量
  53. $this->_init_input();//初始化输入
  54. $this->_init_output();//初始化输出
  55. }
  56. //核心的初始化
  57. functioninit(){
  58. if(!$this->initated){
  59. $this->_init_db();//数据库操作类实例化对象的初始化
  60. $this->_init_memory();//初始化memcache
  61. $this->_init_user();//用户信息初始化
  62. $this->_init_session();//session操作初始化
  63. $this->_init_setting();//系统设置初始化
  64. $this->_init_mobile();//手机功能初始化
  65. $this->_init_cron();//计划任务初始化
  66. $this->_init_misc();//其他功能的初始化
  67. }
  68. $this->initated=true;//初始化完成的标志
  69. }
  70. //定义php环境信息常量和$_G全局变量
  71. /*
  72. *1、主要讲$_G变量的引用赋值给$var数组变量
  73. *2、注意:G变量是程序的全局变量,为了让程序更加高效,减少不必要的数据获取,所以程序特将经常需要用到的变量统一到
  74. *G变量下,如:用户登录信息、后台设置信息、服务器环境信息、客户端cookies、数据缓存等都存放在G变量里面,在制作
  75. *模板文件的时只需将G变量打印出来即可获得需要的信息是否在G变量中
  76. *3、自定义变量:自定义变量是以$开头并且首位为字母或下划线的变量,
  77. *如:$data、$thread、$post、$forumlist、$threadlist
  78. *4、类似$_G[‘gp_xxx‘]变量都是get和post过来的数据
  79. */
  80. function_init_env(){
  81. //设置错误级别
  82. error_reporting(E_ERROR);
  83. if(PHP_VERSION<‘5.3.0‘){
  84. set_magic_quotes_runtime(0);//设置set_magic_quotes_runtime
  85. }
  86. define(‘DISCUZ_ROOT‘,substr(dirname(__FILE__),0,-12));//定义根目录常量:"d:/wamp/www/discuz/"
  87. define(‘MAGIC_QUOTES_GPC‘,function_exists(‘get_magic_quotes_gpc‘)&&get_magic_quotes_gpc());//定义MAGIC_QUOTES_GPC常量
  88. define(‘ICONV_ENABLE‘,function_exists(‘iconv‘));//定义是否支持转码函数常量,如:iconv("gb2312","utf-8","我爱卡");//将gb2312编码转换为utf-8编码
  89. define(‘MB_ENABLE‘,function_exists(‘mb_convert_encoding‘));//定义是否支持转码函数常量,跟iconv用法差不多,有稍微差异
  90. define(‘EXT_OBGZIP‘,function_exists(‘ob_gzhandler‘));//缓存输出句柄函数
  91. define(‘TIMESTAMP‘,time());//定义当前时间戳常量
  92. $this->timezone_set();//设置时区
  93. /*
  94. *1、加载系统核心函数库文件
  95. *2、条件:常量未定义、系统函数库未加载的情况下报"系统核心函数库文件丢失"的错误,否则加载系统核心函数库文件
  96. */
  97. if(!defined(‘DISCUZ_CORE_FUNCTION‘)&&!@include(DISCUZ_ROOT.‘./source/function/function_core.php‘)){
  98. exit(‘function_core.phpismissing‘);//退出,并报"系统核心函数库文件丢失的错误"
  99. }
  100. if(function_exists(‘ini_get‘)){//获取php.ini配置文件中设置的配置信息
  101. $memorylimit=@ini_get(‘memory_limit‘);//设置内存使用限制
  102. if($memorylimit&&return_bytes($memorylimit)<33554432&&function_exists(‘ini_set‘)){
  103. ini_set(‘memory_limit‘,‘128m‘);//如果小于32M,则增加到128M
  104. }
  105. }
  106. define(‘IS_ROBOT‘,checkrobot());//检测机器人
  107. //$GLOBALS:超全局变量,全局作用域中始终可用的内置变量,在函数和方法中无需使用global$xxx声明
  108. foreach($GLOBALSas$key=>$value){
  109. if(!isset($this->superglobal[$key])){//注销没有在$superglobal中出现的超全局变量,也就是注销所有的超级全局变量
  110. $GLOBALS[$key]=null;unset($GLOBALS[$key]);//设置为null并销毁
  111. }
  112. }
  113. //超级变量大数组$_G的定义,在模板文件中要使用
  114. global$_G;//函数体外可以使用,注意:只能在本文件中,或者include的文件中使用,并不能再整个网站中使用
  115. $_G=array(
  116. ‘uid‘=>0,//作者UID
  117. ‘username‘=>‘‘,//用户名
  118. ‘adminid‘=>0,//管理组ID
  119. ‘groupid‘=>1,//用户组ID
  120. ‘sid‘=>‘‘,//cookie和session相关的sid
  121. ‘formhash‘=>‘‘,//表单验证认证
  122. ‘timestamp‘=>TIMESTAMP,//时间戳
  123. ‘starttime‘=>dmicrotime(),//开始时间
  124. ‘clientip‘=>$this->_get_client_ip(),//客户端ip
  125. ‘referer‘=>‘‘,//来路
  126. ‘charset‘=>‘‘,//字符编码设置
  127. ‘gzipcompress‘=>‘‘,//gzip
  128. ‘authkey‘=>‘‘,//密钥
  129. ‘timenow‘=>array(),
  130. ‘PHP_SELF‘=>‘‘,//当前php脚本文件,如:"/discuz/forum.php"
  131. ‘siteurl‘=>‘‘,//站点url
  132. ‘siteroot‘=>‘‘,//站点根目录
  133. ‘siteport‘=>‘‘,//站点端口
  134. ‘config‘=>array(),//配置变量数组
  135. ‘setting‘=>array(),//设置变量数组
  136. ‘member‘=>array(),//用户信息数组
  137. ‘group‘=>array(),//用户组数组
  138. ‘cookie‘=>array(),//cookie数组
  139. ‘style‘=>array(),//风格数组
  140. ‘cache‘=>array(),//缓存列表数组
  141. ‘session‘=>array(),//session变量数组
  142. ‘lang‘=>array(),//语言包数组
  143. ‘my_app‘=>array(),//我的应用数组
  144. ‘my_userapp‘=>array(),//用户应用数组
  145. ‘fid‘=>0,//版块id
  146. ‘tid‘=>0,//帖子id
  147. ‘forum‘=>array(),//论坛版块数组
  148. ‘thread‘=>array(),//论坛相关帖子数组
  149. ‘rssauth‘=>‘‘,//RSS订阅认证
  150. ‘home‘=>array(),//home功能相关数组
  151. ‘space‘=>array(),//space功能相关数组
  152. ‘block‘=>array(),//块信息数组
  153. ‘article‘=>array(),//文章相关
  154. ‘action‘=>array(
  155. ‘action‘=>APPTYPEID,
  156. ‘fid‘=>0,//版块id
  157. ‘tid‘=>0,//帖子id
  158. ),
  159. ‘mobile‘=>‘‘,//手机信息
  160. );
  161. $_G[‘PHP_SELF‘]=htmlspecialchars($this->_get_script_url());//将当前脚本地址写入$_G超级变量中;结果:"/discuz/forum.php"
  162. $_G[‘basescript‘]=CURSCRIPT;//当前不带扩展名的php脚本,如:"forum"
  163. $_G[‘basefilename‘]=basename($_G[‘PHP_SELF‘]);//显示带有文件扩展名的php文件名称,如:"forum.php"
  164. $sitepath=substr($_G[‘PHP_SELF‘],0,strrpos($_G[‘PHP_SELF‘],‘/‘));//如:"/discuz"
  165. if(defined(‘IN_API‘)){
  166. $sitepath=preg_replace("/\/api\/?.*?$/i",‘‘,$sitepath);
  167. }elseif(defined(‘IN_ARCHIVER‘)){
  168. $sitepath=preg_replace("/\/archiver/i",‘‘,$sitepath);
  169. }
  170. $_G[‘siteurl‘]=htmlspecialchars(‘http://‘.$_SERVER[‘HTTP_HOST‘].$sitepath.‘/‘);//网站地址
  171. $url=parse_url($_G[‘siteurl‘]);
  172. $_G[‘siteroot‘]=isset($url[‘path‘])?$url[‘path‘]:‘‘;//网站根目录,如:"/discuz"
  173. $_G[‘siteport‘]=empty($_SERVER[‘SERVER_PORT‘])||$_SERVER[‘SERVER_PORT‘]==‘80‘?‘‘:‘:‘.$_SERVER[‘SERVER_PORT‘];//端口
  174. if(defined(‘SUB_DIR‘)){//二级目录设置情况
  175. $_G[‘siteurl‘]=str_replace(SUB_DIR,‘/‘,$_G[‘siteurl‘]);
  176. $_G[‘siteroot‘]=str_replace(SUB_DIR,‘/‘,$_G[‘siteroot‘]);
  177. }
  178. $this->var=&$_G;//$_G变量的引用赋值给$var,以后对$_G变量或$var变量的修改会直接影响到对方
  179. }
  180. /*
  181. *1、返回PHP_SELF当前脚本文件
  182. */
  183. function_get_script_url(){
  184. if($this->var[‘PHP_SELF‘]===null){
  185. $scriptName=basename($_SERVER[‘SCRIPT_FILENAME‘]);
  186. if(basename($_SERVER[‘SCRIPT_NAME‘])===$scriptName){
  187. $this->var[‘PHP_SELF‘]=$_SERVER[‘SCRIPT_NAME‘];
  188. }elseif(basename($_SERVER[‘PHP_SELF‘])===$scriptName){
  189. $this->var[‘PHP_SELF‘]=$_SERVER[‘PHP_SELF‘];
  190. }elseif(isset($_SERVER[‘ORIG_SCRIPT_NAME‘])&&basename($_SERVER[‘ORIG_SCRIPT_NAME‘])===$scriptName){
  191. $this->var[‘PHP_SELF‘]=$_SERVER[‘ORIG_SCRIPT_NAME‘];
  192. }elseif(($pos=strpos($_SERVER[‘PHP_SELF‘],‘/‘.$scriptName))!==false){
  193. $this->var[‘PHP_SELF‘]=substr($_SERVER[‘SCRIPT_NAME‘],0,$pos).‘/‘.$scriptName;
  194. }elseif(isset($_SERVER[‘DOCUMENT_ROOT‘])&&strpos($_SERVER[‘SCRIPT_FILENAME‘],$_SERVER[‘DOCUMENT_ROOT‘])===0){
  195. $this->var[‘PHP_SELF‘]=str_replace(‘\\‘,‘/‘,str_replace($_SERVER[‘DOCUMENT_ROOT‘],‘‘,$_SERVER[‘SCRIPT_FILENAME‘]));
  196. }else{
  197. system_error(‘request_tainting‘);
  198. }
  199. }
  200. return$this->var[‘PHP_SELF‘];
  201. }
  202. /*
  203. *1、合并$_POST和$_GET,然后将$_POST和$_GET的值都赋予gp变量中,方便使用
  204. *2、禁止对全局变量注入
  205. *3、slashes处理
  206. *4、cookie处理:去掉cookie前缀
  207. */
  208. function_init_input(){
  209. if(isset($_GET[‘GLOBALS‘])||isset($_POST[‘GLOBALS‘])||isset($_COOKIE[‘GLOBALS‘])||isset($_FILES[‘GLOBALS‘])){
  210. system_error(‘request_tainting‘);//...请求中...
  211. }
  212. if(!MAGIC_QUOTES_GPC){//魔术函数是否开启:仅仅对$_GET、$_POST、$_COOKIE起作用;主要用于在讲数据入库前做一些安全性的转义
  213. $_GET=daddslashes($_GET);//对$_GET数据进行转义
  214. $_POST=daddslashes($_POST);//对$_POST数据进行转义
  215. $_COOKIE=daddslashes($_COOKIE);//对$_COOKIE数据进行转义
  216. $_FILES=daddslashes($_FILES);//对$_FILES数据进行转义
  217. }
  218. /*
  219. *1、如果cookie的键值等于定义的键值,那么截取cookie的前缀cookiepre
  220. */
  221. $prelength=strlen($this->config[‘cookie‘][‘cookiepre‘]);
  222. foreach($_COOKIEas$key=>$val){
  223. if(substr($key,0,$prelength)==$this->config[‘cookie‘][‘cookiepre‘]){
  224. $this->var[‘cookie‘][substr($key,$prelength)]=$val;//cookie赋值
  225. }
  226. }
  227. /*
  228. *1、合并$_POST和$_GET,然后将$_POST和$_GET的值都赋予gp变量中,方便使用
  229. */
  230. if($_SERVER[‘REQUEST_METHOD‘]==‘POST‘&&!empty($_POST)){
  231. $_GET=array_merge($_GET,$_POST);
  232. }
  233. //diy
  234. if(isset($_GET[‘diy‘])){
  235. $_GET[‘diy‘]=empty($_GET[‘diy‘])?‘‘:$_GET[‘diy‘];
  236. }
  237. foreach($_GETas$k=>$v){
  238. $this->var[‘gp_‘.$k]=$v;//将$_POST和$_GET的值都赋予gp变量中,方便使用
  239. }
  240. //获取$mod变量,如:/?mod=xxx,那么$this->var[‘mod‘]=xxx;
  241. $this->var[‘mod‘]=empty($this->var[‘gp_mod‘])?‘‘:htmlspecialchars($this->var[‘gp_mod‘]);
  242. //是否需要ajax方式
  243. $this->var[‘inajax‘]=empty($this->var[‘gp_inajax‘])?0:(empty($this->var[‘config‘][‘output‘][‘ajaxvalidate‘])?1:($_SERVER[‘REQUEST_METHOD‘]==‘GET‘&&$_SERVER[‘HTTP_X_REQUESTED_WITH‘]==‘XMLHttpRequest‘||$_SERVER[‘REQUEST_METHOD‘]==‘POST‘?1:0));
  244. //页面获取,最小为1
  245. $this->var[‘page‘]&

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved