您现在的位置是:首页 > 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添加文章的方法:首先,在管理字段:relation 相关文章这里,可以看到下面这段代码:
PHPCMS和帝国CMS怎么选?开发和维护成本对比
phpcms和帝国cms的开发和维护成本对比:1. phpcms开发成本高,维护成本高,适合需要高度定制化的项目。2. 帝国cms开发成本低,维护成本低,适合快速搭建中小型网站。
phpcms调用相关文章的实现方法代码示例
今天我们来说说关于PHPcmsv9系统如何在文章的最后调用随机文章和相关文章,这样做的目的是为了使网站更利于seo优化和增加用户体验效果,其他的小编在这里就不多说了先看看主要内容吧。
phpcms提示2008安装报错怎么办
phpcms 2008安装报错怎么办?报这个错的原因可能是你的mysql版本可能过高导致的。因为报错位置在: 'TYPE=MyISAM DEFAULT CHARSET=gbk'这个地方
相关源码
-
(PC+WAP)蓝色钢结构机械五金工程建筑基建营销型pbootcms模板下载于PbootCMS开发的钢结构与工程机械专用模板,助力企业构建专业级产品展示平台;模板内置工程案例展示、产品参数对照表等专业模块,预设项目进度、施工方案等建筑行业专属栏目查看源码 -
(自适应)蓄电池能源智能数码科技产品pbootcms模板源码下载本款基于PbootCMS开发的网站模板为蓄电池及能源科技企业设计,特别适合锂电池、储能系统、新能源电池等产品的展示与推广。查看源码 -
HTML5响应式健身俱乐部pbootcms网站模板下载为健身俱乐部、瑜伽中心及运动场馆设计的响应式网站模板,采用PbootCMS内核开发,支持一键替换图文适配健身器材销售、瑜伽工作室等多类型运动健康产业。查看源码 -
(自适应)宽屏农业机械农耕设备类网站pbootcms模板免费下载为农机企业打造的现代化响应式网站模板,自动适配电脑、平板和手机,浏览体验一致,独立页面SEO设置,提升搜索引擎可见度。查看源码 -
(自适应)居家生活日用品纸盘纸盒纸杯卫生纸巾生产厂家pbootcms模板为纸品生产企业打造的现代化展示平台,自动适应各种设备屏幕,确保浏览体验一致,完善的SEO功能,提升网站曝光度,基于PbootCMS构建,源码开放可定制。查看源码 -
(自适应html5)重工业钢铁机械设备网站pbootcms响应式模板下载为重工业领域打造的响应式网站模板,助力企业高效展示产品与服务,基于PbootCMS开发的工业级网站模板,特别适合钢铁制造、机械设备生产等重工业企业使用。查看源码
| 分享笔记 (共有 篇笔记) |
