phpcms v9 源码解析- 2 base.php
base.php在上文已经说过,是在PC中重要的一个文件,基本常量、核心类文件的加载都由它来完成。

9行,定义了一个常量 IN_PHPCMS,在系统的入口定义一个常量,在其他文件就判断是否这个常量被定义,防止某人直接越过框架直接进入某些页面,
这个常量在后面的模块、模型操作文件中都会存在,以后朋友们在开发的时候也要严格按照这个要求和规范。
12-26行,主要定义了很多常量,这里主要是对$_SERVER这个服务器变量的运用,打印这个数组便知晓了。
HTTP_REFERER这个常量在后面会经常用到,它只要用于返回上级,在PC中经常很showmessage一起用。如showmessage('参数错误', HTTP_REFERER);
SYS_START_TIME在这里是为后面的程序执行效率做准备的,在系统函数/phpcms/libs/functions/global.func.php里第260行的execute_time()函数结合来用,可得出程序的执行时间。

27-60行,基本上是没法聊下去了,因为这里面基本上都和pc_base这个PC的核心类有关,我们暂时先把这一块放在这,聊完了pc_base这个类,这几段代码也就能明白了,
pc_base这个类过长,也没法很好的截图,那么我就直接以代码行数来定位坐标,方便大家阅读。
pc_base是一个类文件,关于这个类大家需要先清楚静态方法及静态变量,不明白的朋友要先恶补一下,否则将不好理解。
pc_base这个类里面的方法很多都异曲同工,我们拿几个典型的方法来开刀,他是load_sys_class 。(以下代码解释以Cnblogs的代码编辑器为主,所以同学们要打开原代码以对准行数)
/**
* 加载系统类方法
* @param string $classname 类名
* @param string $path 扩展地址
* @param intger $initialize 是否初始化
*/
public static function load_sys_class($classname, $path = '', $initialize = 1) {
return self::_load_class($classname, $path, $initialize);
}
76-78行,从注释上看的出来,load_sys_class方法的三个参数分别是类名称,路径和是否实例化。同时把3个变量传入了_load_class方法,那么_load_class便是我们需要重点研究的方法了。
/**
* 加载类文件函数
* @param string $classname 类名
* @param string $path 扩展地址
* @param intger $initialize 是否初始化
*/
private static function _load_class($classname, $path = '', $initialize = 1) {
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;
}
}
if (file_exists(PC_PATH.$path.DIRECTORY_SEPARATOR.$classname.'.class.php')) {
include PC_PATH.$path.DIRECTORY_SEPARATOR.$classname.'.class.php';
$name = $classname;
if ($my_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;
}
}
107行,static变量,我做项目来使用static主要是俩个方面1、算数累加 2、判断是否重复。
108行,如果$path为空,那么路径就为libs/class/这个目录,同时这也是系统的类库,开发过程可以把第三方类库放这里。
110行,加密了路径和名称,目前还不知道作用,我们先往下看。
111-117行,判断设置了$classes[$key],目前程序走到这里,这个判断是false,但具体作用我们还不知道,先放着,继续往下看。
113-114行,如果这个文件存在,那么加载它。
115-118行,这个主要是判断是否有自己的方法,以防升级出错。
117-121行, 这里$initialize为真就初始化这个类,同时赋值给$classes[$key],看到这里你就该明白111-117行为什么要做这个判断了吗?如果这个变量有值得话表示已经加载过了就不在重复加载以确保执行效率。这里在多说一点,变量$initialize =0或是1的区别在于加载类文件之后是继承还是使用里面的方法。
这个方法到这里算结束了,主要是加载你指定的类文件,如果文件已经加载过了就不重复加载,然后执行是否初始化这个操作。
load_sys_class($classname, $path = '', $initialize = 1) /phpcms/libs/classes/$classname.class.php
load_app_class($classname, $m = '', $initialize = 1) /phpcms/modules/ROUTE_M/classes/$classname.class.php
load_model($classname) /phpcms/model/$classname.class.php
load_sys_func($func) /phpcms/libs/functions/$func.func.php
load_app_func($func, $m = '') 如果 $m为空 /phpcms/modules/ROUTE_M/functions/$func.func.php 否则 /phpcms/modules/$m/functions/$func.func.php
phpcms v9 源码解析- 2 base.php的更多相关文章
- phpcms v9 源码解析-1 index.php
这个是phpcms V9 的入口文件index.php. V9程序的执行绝大多数是从这个文件开始的,但不绝对,在项目下面的api.php和plugin.php是另外的入口文件,这里我们先不做深究. 在 ...
- phpcms v9 源码解析(3)pc_base::creat_app()
69 return self::load_sys_classs('application'); 在前面我们已经知道了,这个load_sys_classs 静态方法,它加载了P ...
- phpcms v9 源码解析(4)content模块下的index.php文件的init()方法解析
在了解index.php中的init函数的时候,让我们先看看最开始的几行代码 1-5 第二行, defined('IN_PHPCMS') or exit('Nopermission resource ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- jQuery整体架构源码解析(转载)
jQuery整体架构源码解析 最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性, ...
- EventBus (三) 源码解析 带你深入理解EventBus
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40920453,本文出自:[张鸿洋的博客] 上一篇带大家初步了解了EventBus ...
- Android 热修复Nuwa的原理及Gradle插件源码解析
现在,热修复的具体实现方案开源的也有很多,原理也大同小异,本篇文章以Nuwa为例,深入剖析. Nuwa的github地址 https://github.com/jasonross/Nuwa 以及用于 ...
- jQuery整体架构源码解析
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- SLF4J源码解析-LoggerFactory(一)
slf4j的含义为Simple logging facade for Java,其为简单的为java实现的日志打印工具,本文则对其源码进行简单的分析 JAVA调用SLF4J public class ...
随机推荐
- Scala Java Error: value filter is not a member of *
有时在Scala中调用Java的库,Java库会返回某些Java的集合或类型,必须经过一些转换才能正常使用. 否则有可能在编译的过程遇到这个错误. 错误字符串 下面是错误的主要信息. Scala Ja ...
- 利用 Composer 一步一步构建自己的 PHP 框架(二)——构建路由
本教程示例代码见 https://github.com/johnlui/My-First-Framework-based-on-Composer 上一篇中我们已经建立了一个空的 Composer 项目 ...
- PHP.11-PHP实例(二)-面向对象实例(图形计算器)
面向对象实例(图形计算器) [PHP语法详解] 1.实现外观 #不同的动作,输出不同的表单 ###关于PHP中,无法使用localhost访问.php文件[http://www.360doc.com/ ...
- iOS 10 的适配问题
随着iOS10发布的临近,大家的App都需要适配iOS10,下面是我总结的一些关于iOS10适配方面的问题,如果有错误,欢迎指出. 1.系统判断方法失效: 在你的项目中,当需要判断系统版本的话,不要使 ...
- TCP/IP协议原理与应用笔记18:构成子网和超网
1. 引言: (1)类别IP编址(Classful IP)的缺陷 • 固定的3种IP网络规模 C类地址:少于255台主机的网络 B类地址:介于255~65535台主机的网络 ...
- Android Studio 复制粘贴图片到drawable文件夹没有效果 - 解决方法
我想放一些图片到drawable文件夹里面,但是简单的复制文件,粘贴文件,或者拖拽文件,都不起作用.不知道为什么,之前是可以的,突然就不行了. 解决方案 在drawable文件夹的目录上右键,选择Re ...
- tomcat部署应用的几种方式
接着上篇 tomcat配置详解,再来学习下如何在tomcat下部署应用 1.部署方式 第一种,最常用,直接把WAR包或者文件夹直接放到webapps目录下面,这时访问路径就是WAR包或者文件夹的名称. ...
- 【技巧性(+递归运用)】UVa 1596 - Bug Hunt
In this problem, we consider a simple programming language that has only declarations of onedimensio ...
- ubuntu下安装Sublime Text并支持中文输入
Sublime Text还是文本编辑器中比较不错的,就是他的文件对比有些差劲吧,还有中文输入需要打补丁,不知道开发者是怎么想的... 当然,这个软件是收费的,但是不买也能一直的使用,在我天朝就这点好处 ...
- Hashtable 和 HashMap 的比较
Hashtable HashMap 并发操作 使用同步机制, 实际应用程序中,仅仅是Hashtable本身的同步并不能保证程序在并发操作下的正确性,需要高层次的并发保护. 下面的代码试图在ke ...