一步步搭建自己的轻量级MVCphp框架-(四)一个国产轻量级框架Amysql源码分析(3) 总进程对象
AmysqlProcess类,框架的总进程对象 ./Amysql/Amysql.php
下面还是和以前一样,先上代码~
class AmysqlProcess {
public $AmysqlController;
public $ControllerName;
public $ActionName;
public $ControllerFile;
function ProcessStart()
{
global $Config;
if ($Config['HttpPath'])
{
$GETParam = (strlen($_SERVER['REQUEST_URI']) > strlen($_SERVER['SCRIPT_NAME'])) ? explode('/', trim(str_ireplace($_SERVER['SCRIPT_NAME'], '', $_SERVER['REQUEST_URI']), '/')) : '';
$GETCount = count($GETParam);
if($GETCount > 1)
for ($i=2; $i<$GETCount; ++$i) $_GET[$GETParam[$i]] = isset($GETParam[++$i]) ? $GETParam[$i] : '';
}
$magic_quotes = function_exists('get_magic_quotes_gpc') ? get_magic_quotes_gpc() : false; // 环境是否有过滤
if($Config['Filter']) // 开启过滤
{
( !$magic_quotes && (Amysql::filter($_GET, 'addslashes') && Amysql::filter($_POST, 'addslashes') && Amysql::filter($_COOKIE, 'addslashes') && Amysql::filter($_FILES, 'addslashes')) );
}
else
{
( $magic_quotes && (Amysql::filter($_GET, 'stripslashes') && Amysql::filter($_POST, 'stripslashes') && Amysql::filter($_COOKIE, 'stripslashes') && Amysql::filter($_FILES, 'stripslashes')) );
}
$this -> ControllerName = !empty($GETParam[0]) ? $GETParam[0] : ( (isset($_GET[$Config['UrlControllerName']]) && !empty($_GET[$Config['UrlControllerName']])) ? $_GET[$Config['UrlControllerName']] : 'index');
$this -> ControllerName = str_replace(_PathTag, DIRECTORY_SEPARATOR, $this -> ControllerName);
$this -> ActionName = !empty($GETParam[1]) ? $GETParam[1] : ( (isset($_GET[$Config['UrlActionName']]) && !empty($_GET[$Config['UrlActionName']])) ? $_GET[$Config['UrlActionName']] : 'IndexAction');
if(!preg_match('/^[A-Za-z](\w)*$/',$this -> ControllerName) || !preg_match('/^[A-Za-z](\w)*$/',$this -> ActionName))
Amysql::AmysqlNotice('路由地址非法!');
$this -> ControllerFile = _Controller . $this -> ControllerName . '.php';
}
function ControllerStart()
{
if(!in_array($this -> ActionName, get_class_methods($this -> ControllerName), true))
Amysql::AmysqlNotice($this -> ActionName . ' 方法不存在');
define("ControllerName", $this->ControllerName);
define("ActionName", $this -> ActionName);
$this -> AmysqlController = new $this->ControllerName($_GET); // 实例控制器
$this -> AmysqlController -> {$this -> ActionName}(); // 执行方法
}
}
首先来说一下这个ProcessStart()进程开始的方法
在这个方法的第一句就是使用global来引入一个全局变量$Config,这个$Config是一个数组,储存了很多框架的初始化配置,详细可以点击这里看一下~
之后便是使用$Config['HttpPath']进行判断是否开启 index.php/Controller/Action/name/value 这样的URL模式,这个在config配置文件里面也说过。
如果开始这样的URL模式,那么就对这个URL进行拆解,然后把内容放入到$_GET这个超全局变量里面。
现在针对$_SERVER['REQUEST_URI']和$_SERVER['SCRIPT_NAME']进行一下详细说明
REQUEST_URI 用来指定要访问的页面,包含后面的参数。
SCRIPT_NAME 包含当前脚本的路径,是不带参数的。
这里的参数就是指在URL地址?后面的部分
例如下面这几行代码
<?php
echo 'REQUEST_URI : '.$_SERVER['REQUEST_URI']."<hr>";
echo 'SCRIPT_NAME : '.$_SERVER['SCRIPT_NAME'];我访问http://127.0.0.1/cs/uri.php/aaa/bbb它输出的结果是
下面详细分析一下这一句的含义
(strlen($_SERVER['REQUEST_URI']) > strlen($_SERVER['SCRIPT_NAME'])) ? explode('/', trim(str_ireplace($_SERVER['SCRIPT_NAME'], '', $_SERVER['REQUEST_URI']), '/')) : '';
这一句的主体是一个三元运算符,条件是strlen($_SERVER['REQUEST_URI']) > strlen($_SERVER['SCRIPT_NAME']),就是说当URL地址中含有参数时那么就对这个参数进行分割,否则就返回一个空格。
对参数进行分割的时候首先使用str_ireplace吧URL地址中的SCRIPT_NAME这一部分给去掉,只留下参数部分。
比如上面的那一个示例,现在使用下面这行代码输出一下
<?php
echo str_ireplace($_SERVER['SCRIPT_NAME'], '', $_SERVER['REQUEST_URI']);

所以就只剩下参数了~
而trim它的作用就是把URL前后有或没有/的都变为不带有/的,比如说/aaa/bbb/就给转换成aaa/bbb
然后再使用explode函数把这个字符串按照"/"进行分割拆解并放入数组$GETParam中。
之所以后面的for循环是从2开始是因为$GETParam[0]代表的是控制器,$GETParam[1]代表的是方法。这些都不是参数,放到$_GET里面的都是一些参数信息
下面的控制器名和方法名都是先检测$GETParam是否存在,如果存在就用$GETParam中的,如果不存在那么就检测按照在config中定义的控制器名称和方法名称去$_GET超全局变量中寻找,如果找不到那么就使用默认的。
下面说一下ControllerStart()函数,这个函数是用来开启控制器的,根据控制器名来创建新的对象放到$this -> AmysqlController中。
这个创建对象使用了一个自动加载魔术函数__autoload(这个函数被写到了function.php文件中。。开始一直都没有找到。。/(ㄒoㄒ)/)
function __autoload($className)
{
if(!file_exists(_Controller . $className . '.php')) Amysql::AmysqlNotice('控制器文件不存在');
include_once _Controller . $className . '.php';
if(!class_exists($className)) Amysql::AmysqlNotice('控制器不存在');
}
这一段的分析就到此结束了~
一步步搭建自己的轻量级MVCphp框架-(四)一个国产轻量级框架Amysql源码分析(3) 总进程对象的更多相关文章
- 一步步搭建自己的轻量级MVCphp框架-(三)一个国产轻量级框架Amysql源码分析(2) 进程
Amysql类 按照我的理解这就是框架的初始化 上代码 class Amysql { public $AmysqlProcess; public function Amysql() { global ...
- 一步步搭建自己的轻量级MVCphp框架-(二)一个国产轻量级框架Amysql源码分析(1)
这个框架是我一个做PHP的朋友“祥子”介绍给我的,Git地址https://coding.net/u/srar/p/AMP/git 下面从入口文件 总线程 ( index.php )开始进行分析 &l ...
- Python的Django框架完成一个完整的论坛(源码以及思路)
一个完整的论坛,登录.注册.发表.头像.点赞.评论.分页.阅读排行等 使用Django2,Python3.5 开发工具:Pycharm5 需要的知识:Python基础知识,Django原理的理解以及使 ...
- DRF框架(一)——restful接口规范、基于规范下使用原生django接口查询和增加、原生Django CBV请求生命周期源码分析、drf请求生命周期源码分析、请求模块request、渲染模块render
DRF框架 全称:django-rest framework 知识点 1.接口:什么是接口.restful接口规范 2.CBV生命周期源码 - 基于restful规范下的CBV接口 3.请求组件 ...
- Flask框架 (四)—— 请求上下文源码分析、g对象、第三方插件(flask_session、flask_script、wtforms)、信号
Flask框架 (四)—— 请求上下文源码分析.g对象.第三方插件(flask_session.flask_script.wtforms).信号 目录 请求上下文源码分析.g对象.第三方插件(flas ...
- drf框架,restful接口规范,源码分析
复习 """ 1.vue如果控制html 在html中设置挂载点.导入vue.js环境.创建Vue对象与挂载点绑定 2.vue是渐进式js框架 3.vue指令 {{ }} ...
- Django搭建及源码分析(三)---+uWSGI+nginx
每个框架或者应用都是为了解决某些问题才出现旦生的,没有一个事物是可以解决所有问题的.如果觉得某个框架或者应用使用很不方便,那么很有可能就是你没有将其使用到正确的地方,没有按开发者的设计初衷来使用它,当 ...
- Rpc框架dubbo-client(v2.6.3) 源码阅读(二)
接上一篇 dubbo-server 之后,再来看一下 dubbo-client 是如何工作的. dubbo提供者服务示例, 其结构是这样的!dubbo://192.168.11.6:20880/com ...
- 一步步实现windows版ijkplayer系列文章之六——SDL2源码分析之OpenGL ES在windows上的渲染过程
一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...
随机推荐
- 用java写一个web服务器
一.超文本传输协议 Web服务器和浏览器通过HTTP协议在Internet上发送和接收消息.HTTP协议是一种请求-应答式的协议——客户端发送一个请求,服务器返回该请求的应答.HTTP协议使用可靠的T ...
- 备份服务器数据(IIS配置备份还原、任务计划、服务列表和APP)
该脚本可以用来导出IIS配置.任务计划.服务列表和APP,同时支持Windows 2003和2008. #定义备份位置 $iisfolder = "d:\Backup_all\IIS&quo ...
- [转]AsyncDisplayKit 教程:达到 60 FPS 的滚动帧率
[原文:https://github.com/nixzhu/dev-blog/blob/master/2014-11-22-asyncdisplaykit-tutorial-achieving-60- ...
- Fox Roddick interviw Federer before 2013 US Open
talk about Mike Jordan , talk about Tiger Woods, their competitor when people discuss you I love wi ...
- freemarker中的round、floor和ceiling数字的舍入处理
freemarker中的round.floor和ceiling数字的舍入处理 1.简易说明 (1)round:四舍五入 (2)floor:向下取整 (3)ceiling:向上取整 2.举例说明 < ...
- 《MySQL必知必会》读书笔记
一.了解MySQL 1.什么是数据库? 数据库是一种以某种有组织的方式存储的数据集合. 2.模式(schema):关于数据库和表的布局及特性的信息. 3. ...
- linux消息队列操作
对消息队列的操作无非有以下三种类型: 1. 打开或创建消息队列消息队列的内核持续性要求每一个消息队列都在系统范围内相应唯一的键值,所以,要获得一个消息队列的描写叙述字,仅仅需提供该消息队列的键值就可以 ...
- Xcode和IOS模拟器
Xcode和IOS模拟器 目录 概述 Xcode常用操作 学会用Instrument IOS模拟器 概述 Xcode常用操作 整体缩进或者缩退 command+“[” .command+“]” 在同一 ...
- IOS格式规范
IOS格式规范 目录 概述 日期格式 NSDateFormatter格式说明 概述 日期格式 声明时间格式:NSDateFormatter *date_formatter = [[NSDateForm ...
- shell 笔记
shell 笔记 通配符 没有 '.' [Aa] 表示 A 或者 a ? 表示任意字符 * 表示任意字符串 IFS data='name, sex, rollno, location' oldIFS= ...
