惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
Engineering at Meta
Engineering at Meta
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 聂微东
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Last Week in AI
Last Week in AI
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 三生石上(FineUI控件)
T
Tailwind CSS Blog
Apple Machine Learning Research
Apple Machine Learning Research
Hugging Face - Blog
Hugging Face - Blog
爱范儿
爱范儿
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
Jina AI
Jina AI
博客园 - 叶小钗
雷峰网
雷峰网
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - Franky
WordPress大学
WordPress大学
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
阮一峰的网络日志
阮一峰的网络日志
量子位

博客园 - 乐军

./upload/index.php ./upload/forum.php 仅个人兴趣,自己通过搜索他人的成果,结合自己的理解,来分析discuz的代码。 Windows 系统的进程中, svchost.exe是做什么的? 如何切断已有的网络连接 Excel 得出字符串最后一个符号的位置 - 乐军 - 博客园 双击文件夹或某个分区,打开时会弹出新的对话窗口,解决办法! [原创] 如何在xp下安装DNS? System Volume Information文件夹是什么? windows下的一些隐藏文件 pagefile.sys文件是什么? MSOCache文件夹是什么? java与Excel (3) java与Excel (2) java与Excel (1) DOS 命令 批处理文件常用命令及其用法(2) 批处理文件常用命令及其用法 QTP测试脚本的大致层次结构
./upload/source/class/class_core.php
乐军 · 2016-03-04 · via 博客园 - 乐军

定义了core这个类

error_reporting() 设置 PHP 的报错级别并返回当前级别。可以参考手册。

define('IN_DISCUZ', true);
define('DISCUZ_ROOT', substr(dirname(__FILE__), 0, -12));
define('DISCUZ_CORE_DEBUG', false);
define('DISCUZ_TABLE_EXTENDABLE', false);

定义了4个常量,他们的作用是:

in_discuz: true 表示可以通过这个文件去访问其他文件,否则不能独立去访问某些文件。

比如,其他的某个文件开头:该文件就是不能直接或者单独被访问的。  

if(!defined('IN_DISCUZ')) {
    exit('Access Denied');
}

discuz_root: 得到class_core.php所在的根目录,即source文件夹所在的目录( source/class 刚好12个字符)。

  dirname(): 返回路径中的目录部分,即一个完整的路径,去掉文件名的部分,类似的还有

  basename() - 返回路径中的文件名部分

  pathinfo() - 返回文件路径的信息

  realpath() - 返回规范化的绝对路径名

  举例说明: __FILE__ = F:\php-projects\Discuz32\upload\forum.php

  那么 dirname() = F:\php-projects\Discuz32\uploadbasename() = forum.php

  pathinfo() 是个array 

array (size=4)
  'dirname' => string 'F:\php-projects\Discuz32\upload' (length=31)
  'basename' => string 'forum.php' (length=9)
  'extension' => string 'php' (length=3)
  'filename' => string 'forum' (length=5)

   DISCUZ_CORE_DEBUG: 设置core类的debug是否开启,默认是false,如果需要调试,可以手动改为true。下面紧接着就用到了。

  DISCUZ_TABLE_EXTENDABLE: 未知

set_exception_handler(array('core', 'handleException'));

设置用户自定义的异常处理函数。参数是一个数组的话,那说明这个数组的第一个元素是类名或对象名称,第二个元素是方法名
如果发生未被捕获的exception的时候,调用core类中的handleException方法。
函数的用途: http://www.w3school.com.cn/php/func_error_set_exception_handler.asp

if(DISCUZ_CORE_DEBUG) {
    set_error_handler(array('core', 'handleError'));
    register_shutdown_function(array('core', 'handleShutdown'));
}

从上面看出,默认core的debug是关闭的,如果为true,则调用用户自定义的错误处理程序, core类的handleError方法。

 register_shutdown_function()介绍:so,这个函数不管是程序执行完毕还是程序执行出错,最后总是会回调我们写的demo函数。好了,我们可以利用这个特性写一个专门记录程序执行错误、记录日志的函数。参考:http://blog.csdn.net/phpwish/article/details/7857917

if(function_exists('spl_autoload_register')) {
    spl_autoload_register(array('core', 'autoload'));
} else {
    function __autoload($class) {
        return core::autoload($class);
    }
}

 function_exists() 检测spl_autoload_register函数是否存在,存在的话,当new core的时候,调用 core::autoload方法来实例化core;否则执行 __autoload()函数实例化,其实也是调用core::autoload方法。

至于spl_autoload_register 和 __autoload 函数的详细解释,参加:http://blog.csdn.net/panpan639944806/article/details/23192267

core::autoload方法如下:

public static function autoload($class) {
        $class = strtolower($class);
        if(strpos($class, '_') !== false) {
            list($folder) = explode('_', $class);
            $file = 'class/'.$folder.'/'.substr($class, strlen($folder) + 1);
        } else {
            $file = 'class/'.$class;
        }

        try {

            self::import($file);
            return true;

        } catch (Exception $exc) {

            $trace = $exc->getTrace();
            foreach ($trace as $log) {
                if(empty($log['class']) && $log['function'] == 'class_exists') {
                    return false;
                }
            }
            discuz_error::exception_error($exc);
        }
    }

 $class 通过 ‘_’被分割成2部分,前面的是文件夹,后面的是文件名。$file = ./class/.../文件名

 然后导入所需的文件。如果导入出现exception,则处理之。