zoukankan      html  css  js  c++  java
  • 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语句进行判断,判断是链接主库还是从库
  • 相关阅读:
    7月15日考试 题解(链表+状压DP+思维题)
    暑假集训日记
    C# .NET 使用 NPOI 生成 .xlsx 格式 Excel
    JavaSE 基础 第42节 局部内部类
    JavaSE 基础 第41节 匿名内部类
    JavaSE 基础 第40节 内部类概述
    JavaSE 基础 第39节 接口的应用
    JavaSE 基础 第38节 接口的实现
    JavaSE 基础 第37节 接口概述
    JavaSE 基础 第36节 抽象类概述与使用
  • 原文地址:https://www.cnblogs.com/yimiao/p/3540530.html
Copyright © 2011-2022 走看看