版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、PHPCMS单入口源码分析本人在查阅PHP相关单入口资料时发现文献很少,而且PHPCMS源码的官方注释也十分有限,所以在此简要的写一篇关于PHPCMS单入口源码的分析,此文给出了PHPCMS入口的主要源码附带本人的一些注释。限于本人的个人水平和疏忽,不能保证文章内的源码注释绝对准确,适合新手朋友学习交流之用。话不多说,首先我们需要下载一个PHPCMS的内容管理系统并安装,相关的下载安装教程百度上很多,在此不再赘述了。安装完成后我们打开安装的PHPCMS工程,打开index.php,这是默认的控制器,也就是唯一的入口了。该文件内的代码很少,详细如下:/* * index.php PHPCMS 入
2、口*/define('PHPCMS_PATH', dirname(_FILE_).DIRECTORY_SEPARATOR);include PHPCMS_PATH.'/phpcms/base.php'pc_base:creat_app(); 该文件定义了一个常量后就引入了一个名为base.php的文件,然后调用该文件中pc_base类的静态方法,创建一个应用。 我们打开安装文件目录下/phpcms/base.php 源码附带注释如下:<?php/* * base.php PHPCMS框架入口文件*/设定入口为truedefine('IN_PHPCM
3、S', true);/ 设定PC_PATH:PHPCMS框架路径define('PC_PATH', dirname(_FILE_).DIRECTORY_SEPARATOR); if(!defined('PHPCMS_PATH') define('PHPCMS_PATH',PC_PATH.'.'.DIRECTORY_SEPARATOR);/设定CACHE_PATH:缓存路径define('CACHE_PATH', PHPCMS_PATH.'caches'.DIRECTORY_SEPARATOR
4、);/设定SITE_PROTOCOL:主机协议define('SITE_PROTOCOL', isset($_SERVER'SERVER_PORT') && $_SERVER'SERVER_PORT' = '443' ? 'https:/' : 'http:/');/设定SITE_URL:当前访问的主机名define('SITE_URL', (isset($_SERVER'HTTP_HOST') ? $_SERVER'HTTP_HOST'
5、; : '');/设定HTTP_REFERER:来源define('HTTP_REFERER', isset($_SERVER'HTTP_REFERER') ? $_SERVER'HTTP_REFERER' : '');/设定SYS_START_TIME:系统开始时间define('SYS_START_TIME', microtime();/加载公用函数库pc_base:load_sys_func('global');pc_base:load_sys_func('extent
6、ion');pc_base:auto_load_func();/加载错误日志、报告、句柄pc_base:load_config('system','errorlog') ? set_error_handler('my_error_handler') : error_reporting(E_ERROR | E_WARNING | E_PARSE);/设置本地时差function_exists('date_default_timezone_set') && date_default_timezone_set(p
7、c_base:load_config('system','timezone');define('CHARSET' ,pc_base:load_config('system','charset');/输出页面字符集header('Content-type: text/html; charset='.CHARSET);/返回当前unix时间戳define('SYS_TIME', time();/定义网站根路径define('WEB_PATH',pc_base:load_c
8、onfig('system','web_path');/js 路径define('JS_PATH',pc_base:load_config('system','js_path');/css 路径define('CSS_PATH',pc_base:load_config('system','css_path');/img 路径define('IMG_PATH',pc_base:load_config('system','img_p
9、ath');/动态程序路径define('APP_PATH',pc_base:load_config('system','app_path');/应用静态文件路径define('PLUGIN_STATICS_PATH',WEB_PATH.'statics/plugin/');if(pc_base:load_config('system','gzip') && function_exists('ob_gzhandler') ob_start(
10、39;ob_gzhandler'); else ob_start();class pc_base /* * 初始化应用程序 * creat_app()不仅包含了application.class.php文件,还返回了一个该类的实例 */public static function creat_app() return self:load_sys_class('application');/* * 加载系统类方法 * param string $classname 类名 * param string $path 扩展地址 * param intger $initializ
11、e 是否初始化 */ /默认path路径为libs/classes public static function load_sys_class($classname, $path = '', $initialize = 1) return self:_load_class($classname, $path, $initialize);/* * 加载应用类方法 * param string $classname 类名 * param string $m 模块 * param intger $initialize 是否初始化 */public static function lo
12、ad_app_class($classname, $m = '', $initialize = 1) $m = empty($m) && defined('ROUTE_M') ? ROUTE_M : $m;if (empty($m) return false;return self:_load_class($classname, 'modules'.DIRECTORY_SEPARATOR.$m.DIRECTORY_SEPARATOR.'classes', $initialize);/* * 加载数据模型 * par
13、am 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 = '', $init
14、ialize = 1) /如果path为空,指定path路径为libs/classes static $classes = array();if (empty($path) $path = 'libs'.DIRECTORY_SEPARATOR.'classes' /返回加密后的类具体路径 给数组的索引$key = md5($path.$classname);if (isset($classes$key) if (!empty($classes$key) return $classes$key; else return true;/* * 如果存在phpcms/$
15、path/$classname.class.php则包含 */if (file_exists(PC_PATH.$path.DIRECTORY_SEPARATOR.$classname.'.class.php') include PC_PATH.$path.DIRECTORY_SEPARATOR.$classname.'.class.php'$name = $classname;/如果此路径下有扩展路径(自定义)phpcms/$path/'MY_'.$classname.class.php便引入/覆盖原$path用自定义$path if ($my_
16、path = self:my_path(PC_PATH.$path.DIRECTORY_SEPARATOR.$classname.'.class.php') include $my_path;/覆盖原类名,用自定义的$name = 'MY_'.$classname;if ($initialize) $classes$key = new $name; /返回文件名类定义类的实例 else $classes$key = true;return $classes$key; else return false;/* * 加载系统的函数库 * param string $
17、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 s
18、tatic 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');/* * 加载插件类库 *$identifica
19、tion插件标识 */public static function load_plugin_class($classname, $identification = '' ,$initialize = 1) /判断插件标识是否为空,判断是否定义插件id$identification = empty($identification) && defined('PLUGIN_ID') ? PLUGIN_ID : $identification;if (empty($identification) return false; /调用load_sys_cla
20、ss函数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
21、$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.'
22、.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,$i
23、dentification) $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 函数名
24、 * param string $path 地址 */private static function _load_func($func, $path = '') static $funcs = array();/* * 如果没有指定位置,默认叠加为phpcms/libs/下的某一位置 */if (empty($path) $path = 'libs'.DIRECTORY_SEPARATOR.'functions'$path .= DIRECTORY_SEPARATOR.$func.'.func.php' $key = md5($p
25、ath);if (isset($funcs$key) return true;/* * 如果存在文件,则包含,否则func$key为false */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(
26、$path = '') /* * 如果path为空,则使用默认path中所有.func.php结尾的函数库(默认libs/functions/autoload/*.func.php) */if (empty($path) $path = 'libs'.DIRECTORY_SEPARATOR.'functions'.DIRECTORY_SEPARATOR.'autoload'$path .= DIRECTORY_SEPARATOR.'*.func.php' /* * 返回path包含的函数库文件,组成数组,遍历数组后
27、包含 */$auto_funcs=array();$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 路径 */public static function my_path($filepath) /* * pathinfo返回关联数组,根据k
28、ey返回用户自定义文件位置 *$path = pathinfo($filepath); /* * 形如: phpcms/modules/content/index.php * 如果存在 phpcms/modules/content/MY_index.php则返回此路径 * 主要用于区别系统默认的index,添加个性化需求 */if (file_exists($path'dirname'.DIRECTORY_SEPARATOR.'MY_'.$path'basename') return $path'dirname'.DIRECTOR
29、Y_SEPARATOR.'MY_'.$path'basename' else return false;/* * 加载配置文件 * param string $file 配置文件 * param string $key 要获取的配置荐 * param string $default 默认配置。当获取配置项目失败时该值发生作用。 * param boolean $reload 强制重新加载。 */public static function load_config($file, $key = '', $default = '', $
30、reload = false) /* * 如果key为空返回$file整个文件(数组形式) * 否则返回file中某一个key的值(二维数组) * */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/+
31、用户file */$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;该base类代码较多主要定义了一些常量,写了一些加载配置、函数和类的函数,要注意的是该
32、类中define('IN_PHPCMS', true);定义了一个进入入口的标志,用来保证访问的合法性,防止直接访问工程内的一些重要文件。另外一个要注意的是该类中的以下代码:public static function creat_app() return self:load_sys_class('application');这就是index.php中creat_app()访问的方法,该函数两次调用了pc_base类的方法,传入的application参数引入了application.class.php并返回了一个该类的实例。该文件在phpcms/libs/cl
33、asses/下,我们打开这个文件,源码如下:<?php/* * application.class.php PHPCMS应用程序创建类 * */class application /* * 初始化应用 */public function _construct() /调用参数类$param = pc_base:load_sys_class('param');define('ROUTE_M', $param->route_m();define('ROUTE_C', $param->route_c();define('ROUT
34、E_A', $param->route_a();/调用应用类事件$this->init();/* * 调用事件 */private function init() /加载控制器对象$controller = $this->load_controller();/判断该类是否存在相应事件if (method_exists($controller, ROUTE_A) /* * 检查方法权限 */if (preg_match('/_/i', ROUTE_A) exit('You are visiting the action is to protect
35、 the private action'); else /调用该类的ROUTE_A方法call_user_func(array($controller, ROUTE_A); else exit('Action does not exist.');/* * 加载控制器-接收一个模块路径($m)和一个控制器对象($filename) * param string $filename 控制器类 * param string $m 模块 * return (obj)$filename - 并引入(访问)指定控制器路径 */private function load_controller($filena
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 消防监督与管理
- 焚烧炉气体冷却与处理系统方案
- 商业街租金定价与空间优化方案
- 储能电站电力调度优化方案
- 2026年闽江师范高等专科学校单招职业技能考试题库附答案
- 2026年宿州学院单招职业适应性考试题库附答案
- 2026年吉林省经济管理干部学院单招职业倾向性测试题库必考题
- 2026年新疆克孜勒苏柯尔克孜自治州单招职业适应性考试题库必考题
- 2026年山东畜牧兽医职业学院单招职业倾向性考试必刷测试卷新版
- 2026年贵州省贵阳市单招职业倾向性考试必刷测试卷及答案1套
- 《超声波液位计》课件
- 机械设备操作风险辨识与应对措施
- 2025-2030中国大米行业市场深度调研及竞争格局与投资研究报告
- 网站对历史发布信息进行备份和查阅的相关管理制度及执行情况说明
- 2023年广东省广州市第27届WMO小学二年级上学期奥林匹克数学竞赛复赛试卷
- 2025村委会房屋租赁合同范本下载(正式版)
- 医疗卫生机构职业安全与健康管理规范(DB4403-T 288-2022)
- 妊娠期糖尿病的预防与控制
- 水平二体育课安全教育
- 仓库年终述职报告
- 2025-2030年中国碳素行业市场运行态势及投资前景规划研究报告
评论
0/150
提交评论