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. MySQL升级指南

    一 .MySQL升级 1.官方升级策略 注意 升级过程中必须使用具有管理权限的MySQL帐户来执行SQL语句. 1.升级方法 逻辑升级: 涉及使用 mysqldump从旧的MySQL版本导出现有数据 ...

  2. linux文件权限,用户和组

    文件权限 默认权限分配 umask umask是通过八进制的数值来定义用户创建文件或目录的默认权限的 安全权限的临界点是,文件默认权限是644,目录默认权限是755 [root@Poppy joker ...

  3. SQLSERVER出错提示:此上下文中不允许使用''。此处只允许使用常量、表达式或变量。不允许使用列名。

    在执行一段SQL语句时出现了这样的一段错误提示,在网上找了不少答案,都说的不是很详细,反复修改试验,最终解决了此问题.原SQl语句为: insert into shoufei(djbh,sflb,jk ...

  4. 10g RAC常用开启关闭命令 – SRVCTL用法

    10G RAC: srvctl 1. Grammar: srvctl <command> <object> [<options]] available <comma ...

  5. Python curses getch()

    window.getch([y, x]) Get a character. Note that the integer returned does not have to be in ASCII ra ...

  6. ncbi API

    https://www.ncbi.nlm.nih.gov/sviewer/?db=nuccore&query_key=2&term=DYNLL2&page_size=1& ...

  7. Tkinter Text(文本)

         Tkinter Text(文本): 文本小部件提供先进的功能,让您编辑多行文本格式,如改变其颜色和字体的方式显示.   文本小部件提供先进的功能,让您编辑多行文本格式,如改变其颜色和字体的方 ...

  8. Tkinter PanedWindow

         Tkinter PanedWindow: 一个PanedWindow是一个容器部件可能包含任何数量的窗格,水平或垂直排列 一个PanedWindow是一个容器部件可能包含任何数量的窗格,水平 ...

  9. 关于git的reset、checkout、revert

    https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting/file-level-operations 最 ...

  10. springboot-shiro chapter03 login

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