【转】UCenter代码研究第一篇(ROOT/admin.php)
<?
/**
* @注释作者 ToniLiu
* ROOT/admin.php 是UCenter整个管理程序的唯一入口程序,用于分发系统的模板,功能等。
* 写了很详细的注释,甚至有点啰嗦,仅限于大家一起学习,呵呵!
* 我会慢慢的把其他比较重要文件都加入详细注释,供大家学习!
*/
define('GMS_VERSION', '1.0.0');
define('GMS_RELEASE', '20080429');
//开发期间,报告任何错误
error_reporting(E_ALL);
//关闭魔术字符串转换功能
set_magic_quotes_runtime(0);
//note 开始时间
$mtime = explode(' ', microtime());
$starttime = $mtime[1] + $mtime[0];
//设置常用的常量
define('IN_GMS', TRUE);
define('GMS_ROOT', substr(__FILE__, 0, -9));
define('GMS_API', strtolower(substr($_SERVER['SERVER_PROTOCOL'], 0, strpos($_SERVER['SERVER_PROTOCOL'], '/'))).'://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/')));
define('GMS_DATADIR', GMS_ROOT.'/data/');
define('GMS_DATAURL', GMS_API.'/data');
define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
//清除变量
unset($GLOBALS, $_ENV, $HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS, $HTTP_SERVER_VARS, $HTTP_ENV_VARS);
//对各种外来变量做魔术字符串转化工作,避免SQL注入
$_GET = daddslashes($_GET, 1, TRUE);
$_POST = daddslashes($_POST, 1, TRUE);
$_COOKIE = daddslashes($_COOKIE, 1, TRUE);
$_SERVER = daddslashes($_SERVER);
$_FILES = daddslashes($_FILES);
$_REQUEST = daddslashes($_REQUEST, 1, TRUE);
//载入相关的基础操作类
require GMS_DATADIR.'config.inc.php';
require GMS_ROOT.'model/base.php';
require GMS_ROOT.'model/admin.php';
//这个文件中存放着daddslashes()以及getgpc()两个函数,原来在这个文件夹中,我给分出去了,看着累,呵呵。
require GMS_ROOT.'function/common.fun.php';
//检查输入的参数,$_REQUEST这个数组是$_GET,$_POST数组的合集,但速度较慢
$m = empty($_REQUEST['m']) ? 'frame' : $_REQUEST['m'];
$a = empty($_REQUEST['a']) ? 'index' : $_REQUEST['a'];
//初始化模块数组,元素的内容和control文件的文件名对应
$model_Array = array('admin', 'app', 'badword', 'pm', 'cache', 'db', 'domain', 'frame', 'log', 'note', 'setting', 'user', 'credit', 'seccode');
//判断输入的$m是否在系统模块之内,如果在执行IF语句里的语句,加载相应控制文件.
if(in_array($m,$model_Array)) {
//根据$m引入相应的CONTROL类文件,各个control文件都继承自base类
//这里的思路应用了简单的工厂模式
include UC_ROOT."control/admin/$m.php";
//初始化相应CONTROL文件的CONTROL类
$control = new control();
//note 不允许访问私有方法
//注解:method_exists()为系统函数
//用于检查第一个参数的类中是否有$method命名的function
//在control类中提供了一个接口函数,用于当调用函数为private时,使用_call()嵌套调用
//在OOP编程中提倡这种调用方法,即所有的函数都应该不能直接被调用,用统一的接口函数去约束
$method = 'on'.$a;
if(method_exists($control, $method) && $method{0} != '_') {
$control->$method();
} elseif(method_exists($control, '_call')) {
$control->_call('on'.$a, '');
} else {
exit('Action not found!');
}
} else {
exit('Module not found!');
}
?>