您现在的位置是:首页 > cms教程 > phpcms教程phpcms教程
PHPCMS源码底层分析phpcms\base.php
卢邦楠2025-05-29phpcms教程已有人查阅
导读我试着解析这个文件的代码,但是发现很乱很杂,现在规整一下,该文件包含一个很重要的类为pc_base,也就是PHPCMS的核心类,这个类中有几个很重要的方法(在模块开发中一定会经常出
我试着解析这个文件的代码,但是发现很乱很杂,现在规整一下,该文件包含一个很重要的类为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。当然这个方法在下面。
这里的PC_PATH常量我还没粘过来代码,但是他所代表的目录是base.php所在的文件目录,也就是/phpcms
如果文件存在于 /phpcms/libs/classes/ 你的类名 + .class.php
如果在 /phpcms/libs/classes/有你的类,且有一个文件叫MY_你的类名 的文件的话赋值给
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 强制重新加载。
*/
https://www.lofter.com/front/login
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;
}
}
}
本文标签:
很赞哦! ()
相关教程
图文教程
phpcms取消后台登录验证码的方法
网站后台验证码,一直是大部分开源程序自带的一个加强后台安全的功能,此功能可以防止后台被程序暴力破解等一些不安全的情况发生。但是我们也都知道,验证码大部分是以图片形式展示的
PHPCMS和PHP有什么区别
PHPCMS和PHP的区别:PHPCMS是一个完整开源的网站内容管理系统,而PHP是一种计算机编程语言,而PHPCMS是用PHP语言进行编写的,所以两者是基本不同的东西,也无法比较区别。
PHPCMS怎么禁止IP访问网站
做网站时间长了,难免会遇到恶意用户,例如灌水等,phpcms如何设置禁止IP访问网站。首先登录phpcms的后台,前往后台登录界面,输入管理员用户名和密码,点击登录。
phpcmsV9首页频道页列表页推荐位简单获取文章浏览量和评论统计的
phpcmsV9首页频道页列表页推荐位简单获取文章浏览量和评论统计列表取得数据方法:频道页获取数据方法首页获取数据方法
相关源码
-
(自适应响应式)教育培训机构集团网站pbootcms源码下载本模板基于PbootCMS系统开发,为教育培训机构设计,特别适合展示课程体系、师资团队和教学成果。采用响应式技术,确保在各类设备上都能提供良好的浏览体验。查看源码 -
(自适应)绿色农业机械设备农场网站源码下载为现代农业机械领域打造的响应式网站模板,采用PbootCMS内核开发,数据实时同步后台管理。通过简洁大气的视觉设计,有效展示农机产品技术参数与应用场景,帮助客户快速建立专业数字化形象。查看源码 -
(PC+WAP)红色户外岗亭钢结构岗亭pbootcms网站模板为钢结构岗亭、户外设施企业打造的高端响应式营销门户,基于PbootCMS开源内核深度开发,采用HTML5自适应架构,实现PC与移动端数据实时同步展示。查看源码 -
(自适应响应式)黑色酷炫高端数码摄影pbootcms网站模板源码本模板基于PbootCMS开发,为摄影工作室、个人摄影师及摄影爱好者设计。采用深色系风格,突出摄影作品展示效果,适配各类数码设备浏览。适用于作品集展示查看源码 -
(自适应响应式)装修装潢设计公司网站源码下载本模板为装修设计企业打造,采用PbootCMS内核开发,整体设计突出空间美学与功能性结合。首页采用大图轮播展示工程案例,服务项目模块支持三维效果展示,呈现装修设计企业的专业形象与技术实力。查看源码 -
快递物流公司pbootcms网站模板html响应式自适应源码下载基于HTML5+CSS3前沿技术开发,实现PC、平板、手机多端自适应。采用弹性布局与媒体查询技术,确保不同设备均有流畅视觉体验,企业形象统一。查看源码
| 分享笔记 (共有 篇笔记) |
