http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 4436|回复: 2

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

[复制链接]
发表于 2013-1-17 00:45:54 | 显示全部楼层 |阅读模式
本帖最后由 fixbug 于 2013-1-21 22:29 编辑

我试着解析这个文件的代码,但是发现很乱很杂,现在规整一下,该文件包含一个很重要的类为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 强制重新加载。
   */
  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]


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-3-24 22:52:09 | 显示全部楼层
发表于 2013-9-6 08:04:56 | 显示全部楼层
这个贴不错!
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-5-21 04:15

© 2014-2021

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