phpcms——源代码阅读1

一、首先是一个index php PHPCMS 入口 。统一入口文件。define( PHPCMS_PATH , dirname(__FILE__) DIRE

一、首先是一个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=****链接已经可以根据路由进行下一步的工作了
标签: 服务器 加载