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 ...
随机推荐
- 模拟admin组件自己开发stark组件之创建篇
admin组件 admin组件为我们提供了针对django管理页面 我们先简短来看下django的admin组件的启动流程,注册流程,url匹配过程 启动注册 1. 扫描所有应用下的注册了应用中的ad ...
- 《C++ Primer》读书笔记
在C++中,基类必须指出希望派生类重新定义哪些函数,定义为virtual的函数是基类期待派生类重新定义的,基类希望派生类继承的函数不能定义为虚函数. 引用和指针的静态类型与动态类型可以不同,这是C++ ...
- spi驱动框架全面分析,从master驱动到设备驱动
内核版本:linux2.6.32.2 硬件资源:s3c2440 参考: 韦东山SPI视频教程 内容概括: 1.I2C 驱动框架回顾 2.SPI 框架简单介绍 3.maste ...
- node+express+socket.io制作一个聊天室功能
首先是下载包: npm install express npm install socket.io 建立文件: 服务器端代码:server.js var http=require("http ...
- django之分页器
view from django.shortcuts import render,HttpResponse # Create your views here. from app01.models im ...
- 深入浅出 Java Concurrency (15): 锁机制 part 10 锁的一些其它问题
主要谈谈锁的性能以及其它一些理论知识,内容主要的出处是<Java Concurrency in Practice>,结合自己的理解和实际应用对锁机制进行一个小小的总结. 首先需要强调的 ...
- [Z] Shell中脚本变量和函数变量的作用域
在shell中定义函数可以使代码模块化,便于复用代码.不过脚本本身的变量和函数的变量的作用域问题可能令你费解,在这里梳理一下这个问题. (1)Shell脚本中定义的变量是global的,其作用域从被定 ...
- mysql和php的内存问题
最近给一个客户把他以前的数据转换到PHPSMC里去,因为他的数据太大出现一些问题,首先出现的是php内存问题,刚导时空白,我就在该也面的头部加上 error_reporting(E_ALL);打印所有 ...
- Python开发丨这些面试题会不会难倒你
1:以下的代码的输出将是什么? 说出你的答案并解释. class Parent(object): x = 1 class Child1(Parent): pass cl ...
- C_FD_PhysRDBMSKinds
C_FD_PhysRDBMSKinds function DateValueToFDSQLStringProc(ADataSet: TDataSet; AValue: Variant): String ...