找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4302|回复: 0

[内置扩展] Discuz x3.5 核心文件 class_core.php

[复制链接]
发表于 2024-5-12 22:44:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
[PHP] 纯文本查看 复制代码
<?php

/**
 *      [Discuz!] (C)2001-2099 Comsenz Inc.
 *      This is NOT a freeware, use is subject to license terms
 *
 *      $Id: class_core.php 33982 2013-09-12 06:36:35Z hypowang $
 */

error_reporting(E_ALL);

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

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

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

spl_autoload_register(array('core', 'autoload'));

C::creatapp();

class core
{
	private static $_tables;
	private static $_imports;
	private static $_app;
	private static $_memory;

	public static function app() {
		return self::$_app;
	}
	/**
	 * 创建并返回一个应用实例。
	 *
	 * @return discuz_application 应用实例。
	 */
	public static function creatapp() {
	    if(!is_object(self::$_app)) {
	        self::$_app = discuz_application::instance();
	    }
	    return self::$_app;
	}

	/**
	 * 根据名称创建并返回一个表对象。
	 *
	 * @param string $name 表的名称。
	 * @return object 表对象。
	 */
	public static function t($name) {
	    return self::_make_obj($name, 'table', DISCUZ_TABLE_EXTENDABLE);
	}

	/**
	 * 根据名称创建并返回一个模型对象。
	 *
	 * @param string $name 模型的名称。
	 * @return object 模型对象。
	 */
	public static function m($name) {
	    $args = array();
	    if(func_num_args() > 1) {
	        $args = func_get_args();
	        unset($args[0]);
	    }
	    return self::_make_obj($name, 'model', true, $args);
	}

	/**
	 * 根据名称和类型创建并返回一个对象实例。
	 *
	 * @param string $name 对象的名称。
	 * @param string $type 对象的类型。
	 * @param bool $extendable 是否可扩展。
	 * @param array $p 传递给对象构造函数的参数数组。
	 * @return object 创建的对象实例。
	 */
	protected static function _make_obj($name, $type, $extendable = false, $p = array()) {
	    $pluginid = null;
	    if($name[0] === '#') {
	        list(, $pluginid, $name) = explode('#', $name);
	    }
	    $cname = $type.'_'.$name;
	    if(!isset(self::$_tables[$cname])) {
	        if(!class_exists($cname, false)) {
	            self::import(($pluginid ? 'plugin/'.$pluginid : 'class').'/'.$type.'/'.$name);
	        }
	        if($extendable) {
	            self::$_tables[$cname] = new discuz_container();
	            switch (count($p)) {
	                case 0:   self::$_tables[$cname]->obj = new $cname();break;
	                case 1:   self::$_tables[$cname]->obj = new $cname($p[1]);break;
	                case 2:   self::$_tables[$cname]->obj = new $cname($p[1], $p[2]);break;
	                case 3:   self::$_tables[$cname]->obj = new $cname($p[1], $p[2], $p[3]);break;
	                case 4:   self::$_tables[$cname]->obj = new $cname($p[1], $p[2], $p[3], $p[4]);break;
	                case 5:   self::$_tables[$cname]->obj = new $cname($p[1], $p[2], $p[3], $p[4], $p[5]);break;
	                default:  $ref = new ReflectionClass($cname);self::$_tables[$cname]->obj = $ref->newInstanceArgs($p);unset($ref);break;
	            }
	        } else {
	            self::$_tables[$cname] = new $cname();
	        }
	    }
	    return self::$_tables[$cname];
	}

	/**
	 * 创建并返回一个内存管理对象实例。
	 *
	 * @return discuz_memory 内存管理对象实例。
	 */
	public static function memory() {
	    if(!self::$_memory) {
	        self::$_memory = new discuz_memory();
	        self::$_memory->init(self::app()->config['memory']);
	    }
	    return self::$_memory;
	}

	/**
	 * 导入指定的文件。
	 *
	 * @param string $name 要导入的文件名称。
	 * @param string $folder 文件所在的文件夹。
	 * @param bool $force 是否强制导入。
	 * @return bool 导入成功返回true,否则返回false。
	 */
	public static function import($name, $folder = '', $force = true) {
	    $key = $folder.$name;
	    if(!isset(self::$_imports[$key])) {
	        $path = DISCUZ_ROOT.'/source/'.$folder;
	        if(strpos($name, '/') !== false) {
	            $pre = basename(dirname($name));
	            $filename = dirname($name).'/'.$pre.'_'.basename($name).'.php';
	        } else {
	            $filename = $name.'.php';
	        }

	        if(is_file($path.'/'.$filename)) {
	            include $path.'/'.$filename;
	            self::$_imports[$key] = true;

	            return true;
	        } elseif(!$force) {
	            return false;
	        } else {
	            throw new Exception('Oops! System file lost: '.$filename);
	        }
	    }
	    return true;
	}

	/**
	 * 处理未捕获的异常。
	 *
	 * @param Exception $exception 异常对象。
	 */
	public static function handleException($exception) {
	    discuz_error::exception_error($exception);
	}

	/**
	 * 处理PHP错误。
	 *
	 * @param int $errno 错误级别。
	 * @param string $errstr 错误信息。
	 * @param string $errfile 发生错误的文件。
	 * @param int $errline 发生错误的行号。
	 */
	public static function handleError($errno, $errstr, $errfile, $errline) {
	    if($errno & DISCUZ_CORE_DEBUG) {
	        discuz_error::system_error($errstr, false, true, false);
	    }
	}

	/**
	 * PHP脚本关闭时执行的函数,用于处理关闭时的错误。
	 */
	public static function handleShutdown() {
	    if(($error = error_get_last()) && $error['type'] & DISCUZ_CORE_DEBUG) {
	        discuz_error::system_error($error['message'], false, true, false);
	    }
	}

	/**
	 * 自动加载类文件。
	 *
	 * @param string $class 要加载的类名。
	 * @return bool 类加载成功返回true,否则返回false。
	 */
	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);
	    }
	}
	/**
	 * 开始分析计时器。
	 *
	 * 该函数用于标记某个分析段的开始时间以及开始时的内存使用情况。支持通过名称和可选的键来标识分析段,
	 * 允许对不同的分析组进行统计。
	 *
	 * @param string $name 分析段的名称。若以'#'开头,后续内容被视为键名,不带'#'的为分析段名称。
	 */
	public static function analysisStart($name){
		$key = 'other'; // 默认键名
		if($name[0] === '#') { // 检查名称是否以'#'开头,以区分键名和分析段名
			list(, $key, $name) = explode('#', $name); // 解析出键名和分析段名
		}
		if(!isset($_ENV['analysis'])) { // 确保分析数组已初始化
			$_ENV['analysis'] = array();
		}
		if(!isset($_ENV['analysis'][$key])) { // 确保指定键的分析数组已初始化
			$_ENV['analysis'][$key] = array();
			$_ENV['analysis'][$key]['sum'] = 0; // 初始化总时间
		}
		// 记录分析段开始时间及内存使用情况
		$_ENV['analysis'][$key][$name]['start'] = microtime(TRUE);
		$_ENV['analysis'][$key][$name]['start_memory_get_usage'] = memory_get_usage();
		$_ENV['analysis'][$key][$name]['start_memory_get_real_usage'] = memory_get_usage(true);
		$_ENV['analysis'][$key][$name]['start_memory_get_peak_usage'] = memory_get_peak_usage();
		$_ENV['analysis'][$key][$name]['start_memory_get_peak_real_usage'] = memory_get_peak_usage(true);
	}

	/**
	 * 停止分析计时器。
	 *
	 * 该函数用于标记某个分析段的结束时间,并计算其持续时间以及结束时的内存使用情况。会返回该分析段的统计信息。
	 *
	 * @param string $name 分析段的名称。格式同analysisStart函数。
	 * @return array 返回指定分析段的统计信息,包括持续时间和其他内存使用指标。
	 */
	public static function analysisStop($name) {
		$key = 'other'; // 默认键名
		if($name[0] === '#') { // 检查名称是否以'#'开头,以区分键名和分析段名
			list(, $key, $name) = explode('#', $name); // 解析出键名和分析段名
		}
		if(isset($_ENV['analysis'][$key][$name]['start'])) { // 确保分析段已开始
			$diff = round((microtime(TRUE) - $_ENV['analysis'][$key][$name]['start']) * 1000, 5); // 计算并格式化持续时间
			$_ENV['analysis'][$key][$name]['time'] = $diff; // 记录持续时间
			$_ENV['analysis'][$key]['sum'] = $_ENV['analysis'][$key]['sum'] + $diff; // 更新总时间
			unset($_ENV['analysis'][$key][$name]['start']); // 清除开始时间标记
			// 记录分析段结束时的内存使用情况
			$_ENV['analysis'][$key][$name]['stop_memory_get_usage'] = memory_get_usage();
			$_ENV['analysis'][$key][$name]['stop_memory_get_real_usage'] = memory_get_usage(true);
			$_ENV['analysis'][$key][$name]['stop_memory_get_peak_usage'] = memory_get_peak_usage();
			$_ENV['analysis'][$key][$name]['stop_memory_get_peak_real_usage'] = memory_get_peak_usage(true);
		}
		return $_ENV['analysis'][$key][$name]; // 返回分析段的统计信息
	}
}

class C extends core {}
class DB extends discuz_database {}

?>

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|新秀网络验证系统API[软著登字第13061951号] ( 豫ICP备2021033257号-1 )

GMT+8, 2026-1-21 12:29 , Processed in 0.242712 second(s), 62 queries , Redis On.

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表
slot777
slot qris
atlas123
KAPAK123
MENARA123
BARONG123
VIRGO123
HORAS123
KAKEK123
ION123
PATEN123
SALAM123
TUYUL123
KUNGLO123
PINTU123
JOKI123
INTI123
JADI123
MENANGBET
JADIJP
ACEH123
TINGGIBET
SUMBER4D
PULANG4D
POLAMAXWIN
INTAN123
dingin4d
paten123
slotsultan
slot sultan