PHPCMS源码底层分析 phpcms\base.php(编写中,未完成)

本文详细解读了PHPCMS的核心类pc_base及其关键方法,包括初始化应用程序、加载系统类、应用类、数据模型等,提供深入理解PHP框架内部运作的指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我试着解析这个文件的代码,但是发现很乱很杂,现在规整一下,该文件包含一个很重要的类为pc_base,也就是PHPCMS的核心类,这个类中有几个很重要的方法(在模块开发中一定会经常出现),所以很有必要单独拿出来一点空间来简述一下几个方法的作用:

  • creat_app 初始化PHPCMS应用程序
  • load_sys_class 加载系统类的方法。
  • load_app_class 加载应用类的方法
  • load_model 加载数据模型
  • _load_class 加载类文件函数
  • load_sys_func 加载系统的函数库
  • auto_load_func 自动加载autoload目录下函数库
  • load_app_func 加载应用函数库
  • load_plugin_class 加载插件类库
  • load_plugin_func 加载插件函数库
  • load_plugin_model 加载插件数据模型
  • _load_func 加载函数库
  • _auto_load_func自动加载函数库
  • my_path 是否有自己的扩展文件
  • load_config 加载配置文件


呵呵光这一个类就很多方法,实在是让人很无语。但是不要气馁,加油继续奋进,往下阅读。


[code=php]

定义一个类,名字叫pc_base
class pc_base {
  
初始化应用程序,注意该方法标识符为static,那么在使用的时候需要注意要用pc_base::creat_app()这样的方式来使用,这也应了index.php入口文件的写法了^_^。

  public static function creat_app() {
    加载系统类,application。当然这个方法在下面。
    return self::load_sys_class('application');
  }
  /**
   * 加载系统类方法
   * @param string $classname 类名
   * @param string $path 扩展地址
   * @param intger $initialize 是否初始化
   */
注意!这个是加载系统类方法
  public static function load_sys_class($classname, $path = '', $initialize = 1) {
这个带下划线的方法_load_class在下面,可以直接跳过去查看
      return self::_load_class($classname, $path, $initialize);
  }
  
  /**
   * 加载应用类方法
   * @param string $classname 类名
   * @param string $m 模块
   * @param intger $initialize 是否初始化
   */
注意!这个是加载应用类方法
  public static function load_app_class($classname, $m = '', $initialize = 1) {
如果$m为空,且有定义ROUTE_M 这个常量,则取值ROUTE_M 否则取值$m
    $m = empty($m) && defined('ROUTE_M') ? ROUTE_M : $m;
如果$m为空 返回false
    if (empty($m)) return false;
依然是这个方法。呵呵
    return self::_load_class($classname, 'modules'.DIRECTORY_SEPARATOR.$m.DIRECTORY_SEPARATOR.'classes', $initialize);
  }
  
  /**
   * 加载数据模型
   * @param string $classname 类名
   */
  public static function load_model($classname) {
    return self::_load_class($classname,'model');
  }
   
  /**
   * 加载类文件函数
   * @param string $classname 类名
   * @param string $path 扩展地址
   * @param intger $initialize 是否初始化
   */

这个方法被使用过很多次,现在系统的研究一下这个方法
  private static function _load_class($classname, $path = '', $initialize = 1) {

定义一个静态的数组
    static $classes = array();

如果$path(扩展地址)为空 ,则给$path赋值为 libs / classes ,也就是目录为/phpcms/libs/classes
    if (empty($path)) $path = 'libs'.DIRECTORY_SEPARATOR.'classes';

取得/phpcms/libs/classes  + 你的所要的类名的 MD5 值
    $key = md5($path.$classname);

如果$classes静态数组中,存在(预设) 这个key为md5的值
    if (isset($classes[$key])) {

如果 $classes静态数组中,存在(预设) 这个key为md5的值 不为空
      if (!empty($classes[$key])) {

则返回这个值。我猜想这里直接返回一个对象吧? 继续向下看才能知道
        return $classes[$key];
      } else {
如果为空,返回一个 true
        return true;
      }
    }

注意! 这里是静态数组中没有md5 值会走到这里

这里的PC_PATH常量我还没粘过来代码,但是他所代表的目录是base.php所在的文件目录,也就是/phpcms
如果文件存在于 /phpcms/libs/classes/ 你的类名 + .class.php
    if (file_exists(PC_PATH.$path.DIRECTORY_SEPARATOR.$classname.'.class.php')) {

就去包含这个文件
      include PC_PATH.$path.DIRECTORY_SEPARATOR.$classname.'.class.php';

声明一个变量name,给他值为你的类名
      $name = $classname;
这个my_path的方法可以在下面找到,你可以直接跳过去查看。这里的意思是

如果在 /phpcms/libs/classes/有你的类,且有一个文件叫MY_你的类名 的文件的话赋值给 $my_path
      if ($my_path = self::my_path(PC_PATH.$path.DIRECTORY_SEPARATOR.$classname.'.class.php')) {
包含这个文件
        include $my_path;
name  变量改值为MY_你的类名
        $name = 'MY_'.$classname;
      }
如果进行初始化
      if ($initialize) {
还记得这个静态数组吧?呵呵果然是给了个对象。
去new了一下$name,$name存放的是 $classname (你的类名)
        $classes[$key] = new $name;
      } else {
如果不初始化,就给当前md5 key一个true的值
        $classes[$key] = true;
      }
返回被new的这个对象或true的值
      return $classes[$key];
    } else {
如果文件不存在,直接返回一个false;
      return false;
    }
  }
  
  /**
   * 加载系统的函数库
   * @param string $func 函数库名
   */
  public static function load_sys_func($func) {
    return self::_load_func($func);
  }
  
  /**
   * 自动加载autoload目录下函数库
   * @param string $func 函数库名
   */
  public static function auto_load_func($path='') {
    return self::_auto_load_func($path);
  }
  
  /**
   * 加载应用函数库
   * @param string $func 函数库名
   * @param string $m 模型名
   */
  public static function load_app_func($func, $m = '') {
    $m = empty($m) && defined('ROUTE_M') ? ROUTE_M : $m;
    if (empty($m)) return false;
    return self::_load_func($func, 'modules'.DIRECTORY_SEPARATOR.$m.DIRECTORY_SEPARATOR.'functions');
  }
  
  /**
   * 加载插件类库
   */
  public static function load_plugin_class($classname, $identification = '' ,$initialize = 1) {
    $identification = empty($identification) && defined('PLUGIN_ID') ? PLUGIN_ID : $identification;
    if (empty($identification)) return false;
    return pc_base::load_sys_class($classname, 'plugin'.DIRECTORY_SEPARATOR.$identification.DIRECTORY_SEPARATOR.'classes', $initialize);
  }
  
  /**
   * 加载插件函数库
   * @param string $func 函数文件名称
   * @param string $identification 插件标识
   */
  public static function load_plugin_func($func,$identification) {
    static $funcs = array();
    $identification = empty($identification) && defined('PLUGIN_ID') ? PLUGIN_ID : $identification;
    if (empty($identification)) return false;
    $path = 'plugin'.DIRECTORY_SEPARATOR.$identification.DIRECTORY_SEPARATOR.'functions'.DIRECTORY_SEPARATOR.$func.'.func.php';
    $key = md5($path);
    if (isset($funcs[$key])) return true;
    if (file_exists(PC_PATH.$path)) {
      include PC_PATH.$path;
    } else {
      $funcs[$key] = false;
      return false;
    }
    $funcs[$key] = true;
    return true;
  }
  
  /**
   * 加载插件数据模型
   * @param string $classname 类名
   */
  public static function load_plugin_model($classname,$identification) {
    $identification = empty($identification) && defined('PLUGIN_ID') ? PLUGIN_ID : $identification;
    $path = 'plugin'.DIRECTORY_SEPARATOR.$identification.DIRECTORY_SEPARATOR.'model';
    return self::_load_class($classname,$path);
  }
  
  /**
   * 加载函数库
   * @param string $func 函数库名
   * @param string $path 地址
   */
  private static function _load_func($func, $path = '') {
    static $funcs = array();
    if (empty($path)) $path = 'libs'.DIRECTORY_SEPARATOR.'functions';
    $path .= DIRECTORY_SEPARATOR.$func.'.func.php';
    $key = md5($path);
    if (isset($funcs[$key])) return true;
    if (file_exists(PC_PATH.$path)) {
      include PC_PATH.$path;
    } else {
      $funcs[$key] = false;
      return false;
    }
    $funcs[$key] = true;
    return true;
  }
  
  /**
   * 加载函数库
   * @param string $func 函数库名
   * @param string $path 地址
   */
  private static function _auto_load_func($path = '') {
    if (empty($path)) $path = 'libs'.DIRECTORY_SEPARATOR.'functions'.DIRECTORY_SEPARATOR.'autoload';
    $path .= DIRECTORY_SEPARATOR.'*.func.php';
    $auto_funcs = glob(PC_PATH.DIRECTORY_SEPARATOR.$path);
    if(!empty($auto_funcs) && is_array($auto_funcs)) {
      foreach($auto_funcs as $func_path) {
        include $func_path;
      }
    }
  }
  /**
   * 是否有自己的扩展文件
   * @param string $filepath 路径
   */

这个函数就是检测你给的文件地址,根据文件地址获得所在目录有没有[MY_文件名]这样的文件文件,有就返回该文件的MY_文件名的路径+名字,没有就返回false

  public static function my_path($filepath) {

得到文件目录的目录信息。
    $path = pathinfo($filepath);

$path['dirname'] 的意思是
比如c:\windows\system32\calc.exe,$path['dirname'] 会取得到c:\windows\system32
$path['basename']
就相当于calc.exe了

如果文件存在于 [文件的目录名称] / MY_文件的名称
    if (file_exists($path['dirname'].DIRECTORY_SEPARATOR.'MY_'.$path['basename'])) {

就返回 [文件的目录名称] / MY_文件的名称
      return $path['dirname'].DIRECTORY_SEPARATOR.'MY_'.$path['basename'];
    } else {
反之就返回false。
      return false;
    }
  }
  
  /**
   * 加载配置文件
   * @param string $file 配置文件
   * @param string $key  要获取的配置荐
   * @param string $default  默认配置。当获取配置项目失败时该值发生作用。
   * @param boolean $reload 强制重新加载。
   */

http://ijiank.lofter.com/
  public static function load_config($file, $key = '', $default = '', $reload = false) {
    static $configs = array();
    if (!$reload && isset($configs[$file])) {
      if (empty($key)) {
        return $configs[$file];
      } elseif (isset($configs[$file][$key])) {
        return $configs[$file][$key];
      } else {
        return $default;
      }
    }
    $path = CACHE_PATH.'configs'.DIRECTORY_SEPARATOR.$file.'.php';
    if (file_exists($path)) {
      $configs[$file] = include $path;
    }
    if (empty($key)) {
      return $configs[$file];
    } elseif (isset($configs[$file][$key])) {
      return $configs[$file][$key];
    } else {
      return $default;
    }
  }
}[/code]  更多

转载于:https://www.cnblogs.com/nbjk/p/3783412.html

基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
MPU6050是一款广泛应用在无人机、机器人和运动设备中的六轴姿态传感器,它集成了三轴陀螺仪和三轴加速度计。这款传感器能够实时监测并提供设备的角速度和线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地与MPU6050进行通信,获取并解析传感器数据。 `MPU6050.cpp`和`MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,包含了定义传感器接口和函数声明。它定义了类`MPU6050`,该类包含了初始化传感器、读取数据等方法。例如,`begin()`函数用于设置传感器的工作模式和I2C地址,`getAcceleration()`和`getGyroscope()`则分别用于获取加速度和角速度数据。 在Arduino项目中,首先需要包含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化传感器。之后,可以通过循环调用`getAcceleration()`和`getGyroscope()`来不断更新传感器读数。为了处理这些原始数据,通常还需要进行校准和滤波,以消除噪声和漂移。 I2C通信协议是MPU6050与Arduino交互的基础,它是一种低引脚数的串行通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地与MPU6050交互。 MPU6050传感器的数据包括加速度(X、Y、Z轴)和角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置和动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度和角速度变化)。 在嵌入式开发领域,特别是使用STM32微控制器时,也可以找到类似的库来驱动MPU6050。STM32通常具有更强大的处理能力和更多的GPIO口,可以实现更复杂的控制算法。然而,基本的传感器操作流程和数据处理原理与Arduino平台相似。 在实际应用中,除了基本的传感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理传感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强大的六轴传感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开发者可以轻松地与传感器交互,获取并处理数据,实现各种创新应用。博客和其他开源资源是学习和解决问题的重要途径,通过这些资源,开发者可以获得关于MPU6050的详细信息和实践指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值