一步步搭建自己的轻量级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(‘控制器不存在‘);
}

这一段的分析就到此结束了,下一段将讲述控制器逻辑层 (C)AmysqlController类的内容~

时间: 2024-10-22 14:01:53

一步步搭建自己的轻量级MVCphp框架-(四)一个国产轻量级框架Amysql源码分析(3) 总进程对象的相关文章

一步步搭建自己的轻量级MVCphp框架-(三)一个国产轻量级框架Amysql源码分析(2) 进程

Amysql类 按照我的理解这就是框架的初始化 上代码 class Amysql { public $AmysqlProcess; public function Amysql() { global $Config; ini_set("magic_quotes_runtime", false); ($Config['DebugPhp'] && error_reporting(E_ALL)) || error_reporting(0); // 是否报错 ($Config[

Python的Django框架完成一个完整的论坛(源码以及思路)

一个完整的论坛,登录.注册.发表.头像.点赞.评论.分页.阅读排行等 使用Django2,Python3.5 开发工具:Pycharm5 需要的知识:Python基础知识,Django原理的理解以及使用,HTML,CSS,JS,jQuery等前端知识的简单理解,对数据库的简单理解 需要的知识可以参考的我的CSDN博客:http://blog.csdn.net/qq_41144008 源码 1:http://www.cnblogs.com/xuyiqing/p/8274959.html 2:htt

ASimpleCache(ACache)源码分析(android轻量级开源缓存框架)

转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46379055 ASimpleCache框架源码链接 https://github.com/yangfuhai/ASimpleCache 杨神作品,大家最熟悉他的应该是afinal框架吧 官方介绍 ASimpleCache 是一个为android制定的 轻量级的 开源缓存框架.轻量到只有一个java文件(由十几个类精简而来). 1.它可以缓存什么东西? 普通的字符串.JsonObj

插件式换肤框架搭建 - 资源加载源码分析

1. 概述 大部分控件我们都会使用,但是我们未必知道其资源加载的原理,目前换肤的框架比较多我们可以随随便便拿过来用,但早在几年前这些资料是比较少的,如果想做一个换肤的框架那就只能自己一点一点啃源码. 如果说我们现在不去用第三方的开源框架,要做一个换肤的功能,摆在我们面前的其实只有一个问题需要解决,那就是如何读取另外一个皮肤apk中的资源. 所有分享大纲:2017Android进阶之路与你同行 视频讲解地址:http://pan.baidu.com/s/1bC3lAQ 2. 资源加载源码分析 2.

Android应用经典主界面框架之一:仿QQ (使用Fragment, 附源码)

最近反复研究日常经典必用的几个android app,从主界面带来的交互方式入手进行分析,我将其大致分为三类.今天记录第一种方式,即主界面下面有几个tab页,最上端是标题栏,tab页和tab页之间不是通过滑动切换的,而是通过点击切换tab页.早期这种架构一直是使用tabhost+activitygroup来使用,随着fragment的出现及google官方也大力推荐使用fragment,后者大有代替前者之势.本文也使用fragment进行搭建,标题中的"经典"指这种交互经典,非本文的代

Android异步任务处理框架AsyncTask源码分析

[转载请注明出处:http://blog.csdn.net/feiduclear_up CSDN 废墟的树] 引言 在平时项目开发中难免会遇到异步耗时的任务(比如最常见的网络请求).遇到这种问题,我们可以自己通过Handler+Message+Thread/ThreadPool来构造一个异步耗时任务框架.当你下次项目中又遇到一个网络请求,你又不得不重写异步耗时任务处理框架.出于避免开发者重复搬砖工作,Google工程师给开发者搭建了一个通用的异步耗时任务处理框架--AsyncTask. Asyn

Django搭建及源码分析(三)---+uWSGI+nginx

每个框架或者应用都是为了解决某些问题才出现旦生的,没有一个事物是可以解决所有问题的.如果觉得某个框架或者应用使用很不方便,那么很有可能就是你没有将其使用到正确的地方,没有按开发者的设计初衷来使用它,当你将一个框架的优势使用到极致时一定是非常舒服和顺手的一件事.但同时也有可能衍生另一个问题,这个框架只解决了你的问题一,没有解决问题二.三等等,因此,就出现了多个框架/应用相结合的情况.比如Django + uWSGI + nginx. 本人初学python,找了一些实例进行了一些操作,以下纯属目前的

【集合框架】JDK1.8源码分析之Collections &amp;&amp; Arrays(十)

一.前言 整个集合框架的常用类我们已经分析完成了,但是还有两个工具类我们还没有进行分析.可以说,这两个工具类对于我们操作集合时相当有用,下面进行分析. 二.Collections源码分析 2.1 类的属性   2.2 构造函数 private Collections() { } 说明:私有构造函数,在类外无法调用. 2.3 方法分析 下面是Collections的所有方法. 可以看到,Collections的方法包含了各种各样的操作.下面分析最常用的方法. 1. sort函数 该函数有两个重载函

缓存框架OSCache部分源码分析

在并发量比较大的场景,如果采用直接访问数据库的方式,将会对数据库带来巨大的压力,严重的情况下可能会导致数据库不可用状态,并且时间的消耗也是不能容忍的.在这种情况下,一般采用缓存的方式.将经常访问的热点数据提前加载到内存中,这样能够大大降低数据库的压力. OSCache是一个开源的缓存框架,虽然现在已经停止维护了,但是对于OSCache的实现还是值得学习和借鉴的.下面通过OSCache的部分源码分析OSCache的设计思想. 缓存数据结构 通常缓存都是通过<K,V>这种数据结构存储,但缓存都是应