phpcms——源代码阅读1

 
更多

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=****链接已经可以根据路由进行下一步的工作了

打赏

本文固定链接: https://www.cxy163.net/archives/861 | 绝缘体

该日志由 绝缘体.. 于 2013年01月09日 发表在 PHPCMS 分类下,
原创文章转载请注明: phpcms——源代码阅读1 | 绝缘体

报歉!评论已关闭.