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语句进行判断,判断是链接主库还是从库
  • 相关阅读:
    如何控制Yahoo! Slurp蜘蛛的抓取频度_国外博客资源站_百度空间
    PHP学习之十:foreach
    asp.net 上传控件
    程序员转型不得不说的事 成为管理者
    博客无法使用外站图片,暂停更新一段时间
    C#控制光驱开关
    通过输入方式在Android上进行微博OAuth登录
    .Net 绑定Dropdownlist的时自定义组合字段后显示
    XNA那些事(四) 3D知识初步
    jQuery实现图片延迟加载
  • 原文地址:https://www.cnblogs.com/yimiao/p/3540530.html
Copyright © 2011-2022 走看看