Discuz核心函数的解析
dz采用的是多入口的方式,在每个入口函数你能看到引用,启动核心类的语句(其余省略),如下:
require './source/class/class_core.php'; C::app()->init();
我们进入class_core.php看看,这是dz项目的启动类
a)首先做的自定义异常处理,自定义错误处理,自定义自动装载函数。
set_exception_handler(array('core', 'handleException')); //自定义异常处理
//如果开启debug,则自定义错误处理
if(DISCUZ_CORE_DEBUG) {
set_error_handler(array('core', 'handleError'));
register_shutdown_function(array('core', 'handleShutdown'));
}
//自定义自动装载函数
if(function_exists('spl_autoload_register')) {
spl_autoload_register(array('core', 'autoload'));
} else {
function __autoload($class) {
return core::autoload($class);
}
}
b)接下来我们看看class_core核心类是怎么写的

c)从流程来看,我们需要首先了解creatapp内部的详细代码,他是用一个单例模式来实例化一个app的对象
public static function creatapp() {
if(!is_object(self::$_app)) {
self::$_app = discuz_application::instance();
}
return self::$_app;
}
通过C::app()来返回这个对象
public static function app() {
return self::$_app;
}
d)t,memory方法分别用来获取数据表,缓存等对象实例
e)分别用C和DB扩展了core和discuz_database,方便以后的需要
class C extends core {}
class DB extends discuz_database {}
现在我们在看看creatapp方法里面的discuz_application类,他是完成discuz应用核心初始化的基础类
其中初始化DB,全局的setting,手机mobile,全局的config都在其中可以仔细的阅读这个类。
这里我重点看看DB:
discuz_application中有个init_db属性,他是控制是否初始化DB的开关,代码如下:
//默认的数据库驱动是db_driver_mysql这个类,如果存在从库的配置项,则将数据库驱动换成db_driver_mysql_slave
private function _init_db() {
if($this->init_db) {
$driver = 'db_driver_mysql';
if(count(getglobal('config/db/slave'))) {
$driver = 'db_driver_mysql_slave';
}
DB::init($driver, $this->config['db']);
}
}
从class DB extends discuz_database {}我们可以看到,DB只是对discuz_database的继承,实现数据库封装的是在discuz_database中完成的。
我先来梳理下关于数据库的几个类,他们的关系
discuz_database是对db_driver_mysql进行的一次封装,其中的public static $db;就是数据库的句柄
db_driver_mysql_slave是对db_driver_mysql进行的继承,并重写了以下方法
function set_config() {}
function table_name() {}
function query() {} //主要对sql语句进行判断,判断是链接主库还是从库
Discuz核心函数的解析的更多相关文章
- discuz核心函数库function_core的函数注释
/** * 系统错误处理 * @param <type> $message 错误信息 * @param <type> $show 是否显示信息 * @param <typ ...
- Ext.Js核心函数( 三)
ExtJs 核心函数简介 1.ExtJs提供的常用函数2.get.fly.getCmp.getDom.getBody.getDoc3.query函数和select函数4.encode函数和decode ...
- jquery对象与核心函数
原生js入口函数与jQuery入口函数的区别 1.window.onload与document.ready在加载时间上的差异 document.ready会先触发,其次才是window.onload ...
- 解密jQuery内核 DOM操作的核心函数domManip
domManip是什么 dom即Dom元素,Manip是Manipulate的缩写,连在一起就是Dom操作的意思. .domManip()是jQuery DOM操作的核心函数 对封装的节点操作做了参数 ...
- 字串符相关 split() 字串符分隔 substring() 提取字符串 substr()提取指定数目的字符 parseInt() 函数可解析一个字符串,并返回一个整数。
split() 方法将字符串分割为字符串数组,并返回此数组. stringObject.split(separator,limit) 我们将按照不同的方式来分割字符串: 使用指定符号分割字符串,代码如 ...
- PHP基于数组的分页函数(核心函数array_slice())
关于数组的分页函数,用数组进行分页的好处是可以方便的进行联合多表查询,只需要将查询的结果放在数组中就可以了以下是数组分页的函数,函数page_array用于数组的分页,函数show_array用于分页 ...
- Jquery核心函数
在Jquery中,所有的DOM对象都将封装成Jquery对象,而且只有Jquery对象才能使用Jquery方法或者属性来执行相应的操作. 所以Jquery提供了一个可以将DOM对象封装成Jquery对 ...
- Ajax 核心函数
今天刚刚了解了Ajax的一个核心函数,由于对javascript还没有系统的学习,目前还没有深入研究Ajax.但是在运用此函数的同时也发现了一些问题--编码问题.这样在后台接收到的URL参数若果有汉字 ...
- 【OpenGL游戏开发之三】OpenGl核心函数库汇总
OpenGl核心函数库 glAccum 操作累加缓冲区 glAddSwapHintRectWIN 定义一组被SwapBuffers拷贝的三角形 glAlphaFunc允许设置alpha检测功能 glA ...
随机推荐
- Echarts运用
echarts客户端写法:http://echarts.baidu.com/doc/example.html ,下载echarts-2.0.4.jar包,把src里面的js引入到项目里,在放esl. ...
- SpringMVC+Spring+Mybatis -- 集成之旅
准备 首先介绍一下,我的工具使用的是STS, 需要的童鞋可以到官网下载:http://spring.io/tools/sts/all 使用STS是因为她集成了Maven进行 “包“ 管理以及自带 We ...
- Python - Pyinstaller
安装 Pyinstaller pip install pyinstaller 使用: test.py print("Hello World!") 命令行输入 pyinstaller ...
- touch python
一 使用while循环输出 1 2 3 4 5 6 8 9 10. i=0 while i<10: i=i+1 if i == 7: continue print(i) 二 求 1-100所 ...
- [POJ] The Triangle
The Triangle Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 47278 Accepted: 28608 De ...
- ubuntu用户添加adduser, useradd并给予sudo权限
ubuntu用户添加adduser, useradd并给予sudo权限 2016-06-15 10:36 1286人阅读 评论(0) 收藏 举报 分类: Ubuntu(80) ubuntu和win ...
- 关于@Autowired使用注意点
@Autowired是按类型进行装配的,那么我一个接口UserInterface,有多个实现类AImpl(@service(name="userInterface1")),BImp ...
- springboot-shiro chapter03 login
简介:这一节主要是集成shiro进行鉴权, 用户登录/退出 环境: IDEA15+JDK1.8+Maven3+ 代码: https://git.oschina.net/xinshu/springboo ...
- 读《分布式一致性原理》JAVA客户端API操作3
更新数据 客户端可以通过zookeeper的API来更新一个节点的数据内容,有如下两个接口: public Stat setData(final String path, byte data[], i ...
- leetcode680
class Solution { public: bool validPalindrome(string s) { int len = s.length(); ) return true; , len ...