请选择 进入手机版 | 继续访问电脑版
查看: 160|回复: 0

Discuz自动加载类文件__autoload方法的使用

[复制链接]

648

主题

650

帖子

3342

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3342
发表于 2021-10-18 08:41:50 | 显示全部楼层 |阅读模式
Discuz自动加载类文件__autoload方法的使用

  1. <?php
  2. if (function_exists("spl_autoload_register")) {
  3.     spl_autoload_register(array("core", "autoload"));
  4. }else{
  5.     function __autoload($class) {
  6.         return core::autoload($class);
  7.     }
  8. }

  9. class core
  10. {
  11.     private static $_imports;

  12.     public static function autoload($class) {
  13.         $class = strtolower($class);
  14.         if (strpos($class, "_") != false) {
  15.             list($folder) = explode("_", $class);
  16.             $file = "class/".$folder."/".substr($class, strlen($folder)+1);
  17.         } else {
  18.             $file = "class/".$class;
  19.         }
  20.         try {
  21.             self::import($file);
  22.             return true;
  23.         } catch (Exception $exc) {
  24.             $trace = $exc->getTrace();
  25.             foreach ($trace as $log) {
  26.                 if (empty($log["class"]) && $log["function"] == "class_exists") {
  27.                     return false;
  28.                 }
  29.             }
  30.             discuz_error::exception_error($exc);
  31.         }
  32.     }

  33.     public static function import($name, $folder="", $force=true) {
  34.         $key = $folder.$name;
  35.         if (!isset(self::$_imports[$key])) {
  36.             $path = DISCUZ_ROOT."/source/".$folder;
  37.             if (strpos($name, "/") !== false) {
  38.                 $pre = basename(dirname($name));
  39.                 $filename = dirname($name)."/".$pre."_".basename($name).".php";
  40.             } else {
  41.                 $filename = $name.".php";
  42.             }
  43.             if (is_file($path."/".$filename)) {
  44.                 include $path."/".$filename;
  45.                 self::$_imports[$key] = true;
  46.                 return true;
  47.             } elseif (!$force) {
  48.                 return false;
  49.             } else {
  50.                 throw new Exception("哎呀!系统文件丢失: ".$filename);
  51.             }
  52.         }
  53.         return true;
  54.     }
  55. }

  56. function libfile($libname, $folder="") {
  57.         $libpath = "/source/".$folder;
  58.         if (strstr($libname, "/")) {
  59.                 list($pre, $name) = explode("/", $libname);
  60.                 $path = "{$libpath}/{$pre}/{$pre}_{$name}";
  61.         } else {
  62.                 $path = "{$libpath}/{$libname}";
  63.         }
  64.         //验证文件的合法路径
  65.         //\w匹配字母或数字或下划线
  66.         //\d匹配数字
  67.         //\/匹配正斜框(/)
  68.         //_匹配下划线
  69.         //DISCUZ_ROOT常量等于D:\phpStudy\WWW\pcool\,在class_core.php文件中定义
  70.         return preg_match('/^[\w\d\/_]+$/i', $path) ? realpath(DISCUZ_ROOT.$path.".php") : false;
  71. }
  72. ?>
复制代码


回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|蓄财网 ( 豫ICP备2021002293号 )

GMT+8, 2021-11-29 21:59 , Processed in 0.103473 second(s), 32 queries .

蓄财网 ©版权所有

© 2021 蓄财网(www.aixc.cn)

快速回复 返回顶部 返回列表