zoukankan      html  css  js  c++  java
  • Discuz!X3解读之类引入机制及目录结构

    实例:

    - /source/class/table/table_forum_faq.php
    - /source/class/model/model_forum_post.php
    - /source/plugin/security/table/table_security_evilpost.php

    ## 引入公共类import($name, $folder = '', $force = true)

    1. 会索引被引入过的类,防止重复引入;
    2. import以应用根目录的source目录为起点进行查找,再子一级目录以$folder定义为起点,$path = DISCUZ_ROOT.'/source/'.$folder;
    3. 再对$name进行解析:如果$name中包含"/",处理掉两端无效的"/",取出其中包含的目录及文件名前缀信息进行最终拼装,如$name='model/forum_post',则拼装成'model/model_forum_post.php';
    4. 最终引入;
    5. 引入结果,引入成功返回true;返回失败,默认抛出异常、设置了!$force后返回false

    ## 创建模型对象 _make_obj($name, $type, $extendable = false, $p = array())

    1. 根据$name的首字母是否为#,确定是否要调用插件目录中的类;$name格式:#插件标识#类名
    2. $type决定类名和文件名的前缀,如model,table,最终的类名:model_$name
    3. 再调用import方式引入类文件,这个过程会构造一个目录结构的参数过去;
    前面提过,所有后台程序文件都是放到根目录的source下;
    除了具体的业务代码,其它公用类分两大类:class、plugin/pluginid/
    此处要引入的类就放在 $type 目录下,再传上$name名
    4. 创建实例
    创建实例之前,根据$extendable是否为真,确定是否将其创建为一种可动态扩展方法的对象。

    ## 带来的可能性

    在不修改代码的情况下,暂时没想到

  • 相关阅读:
    Func<T, TResult>的一个使用场合
    MongoDB 服务启动时指定dbpath
    IM平台即时聊天功能及服务介绍
    线程池参数设置
    List 去重的 6 种方法
    Java中List排序的3种方法!
    Redis 的缓存异常处理 —— 缓存雪崩、缓存击穿、缓存穿透
    吞吐量(TPS)、QPS、并发数、响应时间(RT)概念
    Java中try()catch{}的使用方法
    HashMap七种遍历的方法
  • 原文地址:https://www.cnblogs.com/x3d/p/discuzx3-class-import-mechanism.html
Copyright © 2011-2022 走看看