PHPCMS源码底层分析 phpcms\base.php(编写中,未完成)
我试着解析这个文件的代码,但是发现很乱很杂,现在规整一下,该文件包含一个很重要的类为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] 更多