zoukankan      html  css  js  c++  java
  • phpcms——源代码阅读1

    一、首先是一个index.php
    PHPCMS 入口 。统一入口文件。

    define('PHPCMS_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR);
    
    include PHPCMS_PATH.'/phpcms/base.php';
    
    pc_base::creat_app();

    解释

    dirname(__FILE__) 函数返回的是脚本所在在的路径

    DIRECTORY_SEPARATOR是一个显示系统分隔符的命令,是php内置常量

    include PHPCMS_PATH.'/phpcms/base.php'

    直接包含服务器路径然后加上/phpcms/文件夹下的base.php文件----》执行分支出现1,这里base.php文件要开始执行

    pc_base::creat_app();

    base.php文件调用creat_app();

    public static function creat_app() {
            return self::load_sys_class('application');
        }

    这里load_sys_class()又调用了_load_class()

    _load_class()执行过程中包含了libs文件夹下application.class.php文件表好处代码

    public static function load_sys_class($classname, $path = '', $initialize = 1) {
                return self::_load_class($classname, $path, $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;
            }
        }

    上面执行的结果就是包含libs文件夹下的application.class.php ,然后再包含 param.class.php-----》执行分支出现2,又有两个文件加载进去

    同时执行init()函数,init()函数调用load_controller()

    load_controller函数可以根据参数不同跳转到modules文件夹下去进行包含文件------》执行分支出现3,根据参数不太包含文件

    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('ROUTE_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 the private action');
                } else {
                    call_user_func(array($controller, ROUTE_A));
                }
            } else {
                exit('Action does not exist.');
            }
        }
        
        /**
         * 加载控制器
         * @param string $filename
         * @param string $m
         * @return obj
         */
        private function load_controller($filename = '', $m = '') {
            if (empty($filename)) $filename = ROUTE_C;
            if (empty($m)) $m = ROUTE_M;
            $filepath = PC_PATH.'modules'.DIRECTORY_SEPARATOR.$m.DIRECTORY_SEPARATOR.$filename.'.php';
            if (file_exists($filepath)) {
                $classname = $filename;
                include $filepath;
                if ($mypath = pc_base::my_path($filepath)) {
                    $classname = 'MY_'.$filename;
                    include $mypath;
                }
                return new $classname;
            } else {
                exit('Controller does not exist.');
            }
        }
    }
    __construct()函数引入 param文件 ,执行文件的三个函数
    $param->route_m()///模型
    $param->route_c()//控制器
    $param->route_a()//动作事件

    文件执行到这里其实已经出现基本的mvc架构也就是 index.php?m=**** & c=*** & a=****链接已经可以根据路由进行下一步的工作了
  • 相关阅读:
    UE4 ios环境搭建备忘
    我所理解的打击感 逐帧分析过几十款游戏的开发者经验分享
    可重入锁和不可重入锁
    Java中JDK和JRE的区别是什么?它们的作用分别是什么?
    Java开发岗位面试题
    详解手把手Maven搭建SpringMVC+Spring+MyBatis框架(超级详细版)
    docker:轻量级图形页面管理工具Portainer
    Docker整合dockerfly实现UI界面管理(单机版)
    docker for mac的JSON配置文件中的hosts项修改后无法生效
    Maven [ERROR] 不再支持源选项 5。请使用 6 或更高版本
  • 原文地址:https://www.cnblogs.com/fslnet/p/2309276.html
Copyright © 2011-2022 走看看