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语句进行判断,判断是链接主库还是从库
  • 相关阅读:
    PyQt5基础应用一
    常用SQL
    常用vim命令
    原生Ajax XMLHttpRequest对象
    跨域两种解决方案CORS以及JSONP
    Django生命周期 URL ----> CBV 源码解析-------------- 及rest_framework APIView 源码流程解析
    Django缓存机制--rest_framework中节流源码使用的就是django提供的缓存api
    Django2.0 models中的on_delete参数
    【开发工具IDE】Eclipse 安装 Maven 的 m2eclipse 插件
    【Java】CSVUtils
  • 原文地址:https://www.cnblogs.com/yimiao/p/3540530.html
Copyright © 2011-2022 走看看