Discuz核心函数的解析

本文解析了Discuz!论坛系统中数据库初始化的过程,包括自定义异常处理、错误处理及自动装载函数设置等关键步骤。同时介绍了核心类core的应用及数据库驱动的选择依据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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语句进行判断,判断是链接主库还是从库

 

 

转载于:https://www.cnblogs.com/yimiao/p/3540530.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值