Ryongyon!

这世界上假绅士太多,缺少训练有素的流氓

· 杂乱无章 · · 9327次浏览

TinyPHP 源码讲解(2):框架核心

框架核心

顾名思义,这是框架的核心文件。前面我讲到通过入口文件实例化并执行 init 方法,那么下面我们看一下 init 方法做了哪些事情?

// 初始化
public function init() {
// 开启 Session
session_start();
// 自动加载
spl_autoload_register(array($this, 'loadClass'));
// 错误处理
set_error_handler(array('AppError', 'errorHandle'), E_ALL ^ E_NOTICE);
// 异常处理
set_exception_handler(array('AppException', 'exceptionHandle'));
// 检测敏感字符并删除
$this->removeMagicQuotes();
// 检测自定义全局变量并移除
$this->unregisterGlobals();
// 安装
$this->install();
// 路由
$this->router();
}

可以看到我们首先通过 session_start()") 开启了 Session ,为什么要开启 Session 呢?当然是为了接下来框架使用 Session 的时候可以直接使用,而不是使用的时候才去开启。

接下来我们注册自动加载、自定义错误、异常处理就比较好理解了,这里不在阐述。不明白可以前往官网文档查阅:

接下来就是简单的安全防范了,检测敏感字符并删除以及检测自定义全局变量并移除,这也比较好理解就不细说了。

再往下就是检测安装,这个方法中会尝试连接一次数据库,如果失败的话就视为没有安装过程序,则加载安装引导文件并用 exit 方法阻止继续往下执行代码,不然的话会继续前往路由方法。

安装引导文件也十分简单,就是填写一些信息,主要就是填写数据库。提交后会再一次尝试连接数据库(用于判断提交的数据库信息是否有效),如果连接成功,则创建数据库。并且将提交的数据库信息写入配置文件中。(就是将 %1%', '%2%', '%3%', '%4%', '%5%', '%6%', '%7%' 改写为提交的数据库信息)

OK,回到框架核心,最后我们得执行路由方法。

// 路由
private function router() {
// 变量预赋值
$controller = 'index';      // 默认控制器
$method     = 'init';       // 默认动作
$param      = [];           // 默认参数
// 是否开启伪静态
if (URL_REWRITE) {
// 获取Url
$url      = trim($_SERVER['REQUEST_URI'], '/');
$position = strpos($url, '?');
// 删除 '?' 以及之后的内容
$url = $position === false ? $url : substr($url, 0, $position);
// 使用 '/' 分割字符串为数组
$url = explode('/', $url);
// 删除空的数组元素
$url = array_filter($url);
// 赋值控制器名
$controller = $url[0] && $url[0] !== 'index.php' ? $url[0] : $controller;
// 赋值动作名
$method     = $url[1] ? $url[1] : $method;
// 赋值参数值
array_splice($url,0,2);
$param = $url ? $url : $param;
} else {
// 赋值控制器名
$controller = $_GET['c'] ? $_GET['c']: $controller;
// 赋值动作名
$method     = $_GET['a'] ? $_GET['a']: $method;
// 赋值参数值
$param      = $_GET['p'] ? explode(',', $_GET['p']): $param;
}
// 判断控制器和动作是否存在
$controller = 'Core\\Controllers\\'. $controller . 'Controller';
if (!class_exists($controller)) throw new Exception('无法匹配 ' . $controller . ' 控制器', 404);
if (!method_exists($controller, $method)) throw new Exception('无法匹配 ' . $method . ' 动作', 404);
// 实例化控制器
$dispatch = new $controller();
call_user_func_array(array($dispatch, $method), $param);
}

其实每个步骤都有注释,很好理解。先赋值默认的控制器、方法名、参数。如果没有指定控制器的情况下,比如直接访问的时候默认加载 index 控制器文件,并且执行控制器文件里的 init 方法。

然后就是判断是否开启了 伪静态 ,因为有两种不同的解析URL方式。这里已经说明过不在阐述。https://github.com/Ryongyon/TinyPHP#%E8%B7%AF%E7%94%B1

解析完毕以后则判断控制器、方法名是否存在,如果不存在的话就抛出一个异常错误。如果在调试模式关闭的情况下会得到404页面

最后就是实例化控制器、执行方法、传递参数啦。

自此,框架核心的部分结束

TinyPHP 源码讲解

评论 (0条)