|  | 
 
| 本帖最后由 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]
 
 | 
 |