zoukankan      html  css  js  c++  java
  • 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

                                                                                                       

               

             

  • 相关阅读:
    自定义百度地图链接
    Spring中获取request、response对象的方法
    Windows中使用TortoiseGit提交项目到GitLab配置
    IDEA热部署
    SpringBoot+thymeleaf+mybatis+shiro
    lombok——简化Java代码
    SpringBoot部署到tomcat
    深度学习--深入理解Batch Normalization
    MCMC(一)蒙特卡罗法
    Java反射机制详解
  • 原文地址:https://www.cnblogs.com/Hebe0115/p/3484975.html
Copyright © 2011-2022 走看看