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核心函数的解析的更多相关文章

  1. discuz核心函数库function_core的函数注释

    /** * 系统错误处理 * @param <type> $message 错误信息 * @param <type> $show 是否显示信息 * @param <typ ...

  2. Ext.Js核心函数( 三)

    ExtJs 核心函数简介 1.ExtJs提供的常用函数2.get.fly.getCmp.getDom.getBody.getDoc3.query函数和select函数4.encode函数和decode ...

  3. jquery对象与核心函数

    原生js入口函数与jQuery入口函数的区别 1.window.onload与document.ready在加载时间上的差异 document.ready会先触发,其次才是window.onload ...

  4. 解密jQuery内核 DOM操作的核心函数domManip

    domManip是什么 dom即Dom元素,Manip是Manipulate的缩写,连在一起就是Dom操作的意思. .domManip()是jQuery DOM操作的核心函数 对封装的节点操作做了参数 ...

  5. 字串符相关 split() 字串符分隔 substring() 提取字符串 substr()提取指定数目的字符 parseInt() 函数可解析一个字符串,并返回一个整数。

    split() 方法将字符串分割为字符串数组,并返回此数组. stringObject.split(separator,limit) 我们将按照不同的方式来分割字符串: 使用指定符号分割字符串,代码如 ...

  6. PHP基于数组的分页函数(核心函数array_slice())

    关于数组的分页函数,用数组进行分页的好处是可以方便的进行联合多表查询,只需要将查询的结果放在数组中就可以了以下是数组分页的函数,函数page_array用于数组的分页,函数show_array用于分页 ...

  7. Jquery核心函数

    在Jquery中,所有的DOM对象都将封装成Jquery对象,而且只有Jquery对象才能使用Jquery方法或者属性来执行相应的操作. 所以Jquery提供了一个可以将DOM对象封装成Jquery对 ...

  8. Ajax 核心函数

    今天刚刚了解了Ajax的一个核心函数,由于对javascript还没有系统的学习,目前还没有深入研究Ajax.但是在运用此函数的同时也发现了一些问题--编码问题.这样在后台接收到的URL参数若果有汉字 ...

  9. 【OpenGL游戏开发之三】OpenGl核心函数库汇总

    OpenGl核心函数库 glAccum 操作累加缓冲区 glAddSwapHintRectWIN 定义一组被SwapBuffers拷贝的三角形 glAlphaFunc允许设置alpha检测功能 glA ...

随机推荐

  1. Echarts运用

    echarts客户端写法:http://echarts.baidu.com/doc/example.html  ,下载echarts-2.0.4.jar包,把src里面的js引入到项目里,在放esl. ...

  2. SpringMVC+Spring+Mybatis -- 集成之旅

    准备 首先介绍一下,我的工具使用的是STS, 需要的童鞋可以到官网下载:http://spring.io/tools/sts/all 使用STS是因为她集成了Maven进行 “包“ 管理以及自带 We ...

  3. Python - Pyinstaller

    安装 Pyinstaller pip install pyinstaller 使用: test.py print("Hello World!") 命令行输入 pyinstaller ...

  4. 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所 ...

  5. [POJ] The Triangle

    The Triangle Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 47278   Accepted: 28608 De ...

  6. ubuntu用户添加adduser, useradd并给予sudo权限

    ubuntu用户添加adduser, useradd并给予sudo权限 2016-06-15 10:36 1286人阅读 评论(0) 收藏 举报  分类: Ubuntu(80)  ubuntu和win ...

  7. 关于@Autowired使用注意点

    @Autowired是按类型进行装配的,那么我一个接口UserInterface,有多个实现类AImpl(@service(name="userInterface1")),BImp ...

  8. springboot-shiro chapter03 login

    简介:这一节主要是集成shiro进行鉴权, 用户登录/退出 环境: IDEA15+JDK1.8+Maven3+ 代码: https://git.oschina.net/xinshu/springboo ...

  9. 读《分布式一致性原理》JAVA客户端API操作3

    更新数据 客户端可以通过zookeeper的API来更新一个节点的数据内容,有如下两个接口: public Stat setData(final String path, byte data[], i ...

  10. leetcode680

    class Solution { public: bool validPalindrome(string s) { int len = s.length(); ) return true; , len ...