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=****链接已经可以根据路由进行下一步的工作了
  • 相关阅读:
    cf1100 F. Ivan and Burgers
    cf 1033 D. Divisors
    LeetCode 17. 电话号码的字母组合
    LeetCode 491. 递增的子序列
    LeetCode 459.重复的子字符串
    LeetCode 504. 七进制数
    LeetCode 3.无重复字符的最长子串
    LeetCode 16.06. 最小差
    LeetCode 77. 组合
    LeetCode 611. 有效三角形个数
  • 原文地址:https://www.cnblogs.com/fslnet/p/2309276.html
Copyright © 2011-2022 走看看