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的更多相关文章

  1. phpcms v9 源码解析-1 index.php

    这个是phpcms V9 的入口文件index.php. V9程序的执行绝大多数是从这个文件开始的,但不绝对,在项目下面的api.php和plugin.php是另外的入口文件,这里我们先不做深究. 在 ...

  2. phpcms v9 源码解析(3)pc_base::creat_app()

    69     return self::load_sys_classs('application');          在前面我们已经知道了,这个load_sys_classs 静态方法,它加载了P ...

  3. phpcms v9 源码解析(4)content模块下的index.php文件的init()方法解析

    在了解index.php中的init函数的时候,让我们先看看最开始的几行代码 1-5  第二行, defined('IN_PHPCMS') or exit('Nopermission resource ...

  4. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  5. jQuery整体架构源码解析(转载)

    jQuery整体架构源码解析 最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性, ...

  6. EventBus (三) 源码解析 带你深入理解EventBus

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40920453,本文出自:[张鸿洋的博客] 上一篇带大家初步了解了EventBus ...

  7. Android 热修复Nuwa的原理及Gradle插件源码解析

    现在,热修复的具体实现方案开源的也有很多,原理也大同小异,本篇文章以Nuwa为例,深入剖析.  Nuwa的github地址 https://github.com/jasonross/Nuwa 以及用于 ...

  8. jQuery整体架构源码解析

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  9. SLF4J源码解析-LoggerFactory(一)

    slf4j的含义为Simple logging facade for Java,其为简单的为java实现的日志打印工具,本文则对其源码进行简单的分析 JAVA调用SLF4J public class ...

随机推荐

  1. Android(java)学习笔记93:Android布局详解之一:FrameLayout

    FrameLayout是最简单的布局了.所有放在布局里的控件,都按照层次堆叠在屏幕的左上角.后加进来的控件覆盖前面的控件. 在FrameLayout布局里,定义任何空间的位置相关的属性都毫无意义.控件 ...

  2. SSIS 学习(9):包部署常见问题汇总【转】

    Integration Services 包在部署过程中,经常会出现这样那样的问题,让人摸不着头脑,很是烦人.下面我就将我在部署过程中,遇到的一些问题整理出来,以供大家参考. (一)SSIS包在SQL ...

  3. iOS “获取验证码”按钮的倒计时功能

    iOS 的倒计时有多种实现细节,Cocoa Touch 为我们提供了 NSTimer 类和 GCD 的dispatch_source_set_timer方法去更加方便的使用计时器.我们也可以很容易的的 ...

  4. oracle10g 和oracle11g同时安装时PL/SQL连不上解决方案

    oracle10g 和oracle11g同时安装的时候,PL/SQL连不上解决办法:找到两者的配置文件改成一致 oracle10g服务端和oracle11g客户端同时安装的时候,PL/SQL连不上解决 ...

  5. [课程相关]homework-04

    零.准备工作 这次的作业仍然是结对编程,我们队伍的成员为:梁杰.夏天晗.谢祖三.上次我们是选择了一个时间大家聚在一起进行编程,效果不错,所以这次我们还是决定采用这种方式.由于大家平时比较忙,这周六日我 ...

  6. django–url

    当我们创建了一个项目时,系统为我们创建了一份urlconf, 它可能是这样的: urlpatterns = [ url(r'^admin/', admin.site.urls), ] r'^admin ...

  7. TensorFlow安装与测试

    官网:http://tensorflow.org/安装步骤:1.sudo apt-get install python-pip python-dev python-virtualenv 2.virtu ...

  8. jquery手写焦点轮播图-------解决最后一张无缝跳转第一张的问题

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 【路径寻找问题】UVa 10603 - Fill

    如家大神书上的例题.第一次接触也是按代码敲得.敲的过程感觉很直观.但自己写估计会写的乱七八糟.以后不能砍得难就不愿意做这种题.否则只能做一些水题了.(PS:48) 紫书 #include<ios ...

  10. Ajax返回xml类型数据

    ajax可以返回文本类型数据和xml类型数据,xml是计算机通用语言 可以使用js解析返回xml类型数据的dom对象 前端页面 <!doctype html> <html lang= ...