澳门新葡萄京官网首页 22

澳门新葡萄京官网首页用PHP开始你的MVC (一)整合你的站点入口

这是一篇介绍怎样用php来落到实处MVC情势开采的文书。关于MVC格局的技艺作品英特网四处能够,所以那篇文书将不再陈述这种格局的优劣点,子讲她的php技艺实现。何况在之后的数不完文章中也是以讲技能为主。一、实现合併的网址输入大家兴许平常在互连网看见那般的不二等秘书籍(State of Qatar,令人不知所以,这样的网站的完结情势有三种恐怕:1、掩盖文件的恢弘名,对这种做法的功利,众说纷纷,可是个人感觉未有要求;2、用了网址的重定向准绳,完成虚构路线;3、强逼文件解析的不二等秘书诀,完毕设想路线。用第23种艺术能够完毕网址的集合接口,合理的组成网址,更加好的反映网址的安全性和结构,用这两种方法的网址多数是采用MVC方式营造和促成的。上面是三个事例访谈路线如下:
……/test/*******/Bad……/test/*******/Good(其中的******能够用其余字符串替换,…….是您的web路线卡塔尔文件的目录布局如下
|–.htaccess|–test|–Application.php|–Controler/GoodControler.php|–Controler/BadControler.php注意文件.htaccess,在windows下不能够直接建设结构的,能够在命令行格局下创立.
文件0:(.htaccess卡塔尔(قطر‎(那个文件是改革apache的布署方式用的卡塔尔(قطر‎filestestforcetypeapplication/x- 文件1:(test.php卡塔尔国?php/*————————————-*test.php**用作你的网址的进口的文本*用来起首化和输入*调用试行Controler的调用*————————————-*/requireApplication.php;$aa=newApplication();$aa-parse();$aa-go();?
文件2:(GoodControler.php) ?

一、PATHINFO功效简述

主要:

  搞PHP的都知道ThinkPHP是二个无需付费开源的轻量级PHP框架,虽说轻量但它的功用却很有力。那也是本身接触学习的首先个框架。TP框架中的UEnclaveL暗中同意方式正是帕特hInfo格局。那些方式很刚劲,每当你探问二个网站必然蕴涵一长串参数,但是太长又显得不太融洽。对于访谈一个以MVC情势搭建的网址,必然带有M、C、A多个参数即module、controller、action,那一个参数要求还需求用&符号隔断,假设参数量相当多,就显得特别的不和谐啦。不过PathInfo情势效用正是将这一长串减少简化,让那一个门路变得尤为温馨的浮现。

  1. 常量优化路线
  2. 活动加载类
  3. 优化进口文件
  4. 安然访谈项目目录

历史观的拜见路线是那样子的:


…..

--------------文件结构:--------------------------------------blog
├─App
│ ├─Model 模型
│ │ └─UserModel.class.php 用户模型类 
│ ├─View 视图
│ │ ├─Back后台
│ │ │ └─Index
│ │ │ └─index.html 后台首页面
│ │ └─Home前台
│ │ └─User 用户视图目录
│ │ └─login.html 登录表单页面
│ ├─Controller 控制器
│ │ ├─Back后台
│ │ │ └─IndexController.class.php 后台首页控制器
│ │ └─Home前台
│ │ └─UserController.class.php 用户控制器
├─Public 静态公共文件(js,css,images)
│ ├─Plugins 插件
│ │ └─layui 前端框架插件
│ ├─Back后台
│ │ ├─js/ js文件
│ │ ├─css/ css样式文件
│ │ └─image img图片 
│ └─Home前台
│ ├─js/ js文件
│ ├─css/ css样式文件
│ └─image img图片 
├─Frame 公共使用的类
│ ├─BaseModel.class.php 数据库连接类
│ ├─BaseController.class.php 控制器公共操作(设置编码,信息跳转)
│ ├─FactoryModel.class.php 模型工厂类
│ ├─Init.class.php 初始化应用类
│ └─MySQLDB.class.php 数据库操作工具类
└─index.php 入口文件-----------------------------------------------------------------

而ThinkPHP在暗许的U奥迪Q5L情势下能够成功这样子的不二等秘书诀:


澳门新葡萄京官网首页,…..

上一篇中,提议4个难题待消除,本篇聚焦国化学工业进出口总公司解那4个难点,最终变成总体的微型MVC框布局造,
后续博客项目,或任何品种,均能够一向运用该框架构造进行付出学习。

互相相比较十分轻易就得出结论:PathInfo方式下的访谈路线突显越发本人!

下载查看该类型源码:

然则在此篇小说中本身所要陈述的就是哪些搭建好这种温馨的拜见路线。

常量优化路线

未雨希图粮草先行: 创设分支

1 $ git checkout master2 $ git checkout -b "MVC"

本身的靶子路线是那样子的(当然TP也能够超轻易完结这样子):

  思路

  1)把常用的目录路线定义成常量。如 模型目录,调控器目录等
 2)引进类应用定义的常量替代部分路径。 如 include
FRAME.BaseModel.class.php
3) 载入视图使用常量替代部分路径 如 include VIEW.’login.html’ 简单款式

…..

  代码完毕

1)操作步骤

澳门新葡萄京官网首页 1澳门新葡萄京官网首页 2

step 1: 在入口文件中定义所需要的常量step 2: 控制器中引入视图时, 使用常量进行优化 

操作步骤思路

2卡塔尔(قطر‎ 入口文件中定义常用路线常量 【index.php】

 1 <?php 2 /** 3  * 入口文件 4  */ 5 $p = !empty($_GET['p']) ? $_GET['p'] : 'Home';  //平台 6 $c = !empty($_GET['c']) ? $_GET['c'] : 'User';  //控制器 7 $a = !empty($_GET['a']) ? $_GET['a'] : 'login'; //动作 8  9 define('PLAT', $p);  //平台常量10 define('CTR', $c);  //控制器11 define('ACTION', $a); //动作12 13 14 define('DS', DIRECTORY_SEPARATOR); //目录分割符15 define('ROOT', getcwd;  //当前所在目录 项目目录16 define('FRAME', ROOT.'Frame'.DS);17 define('APP', ROOT.'App'.DS);18 define('PUB', ROOT.'Public'.DS);19 define('ADMIN', PUB.'Admin'.DS);20 define('HOME', PUB.'Home'.DS);21 22 //MVC目录23 define('MODEL', APP.'Model'.DS);24 define('VIEW', APP.'View'.DS.PLAT.DS.CTR.DS);25 define('CTRONLLER', APP.'Controller'.DS.PLAT.DS);26 27 $ctr = $c."Controller";28 29 require_once FRAME.'Db.class.php';  //数据库操作类30 require_once FRAME.'BaseModel.class.php';  //基础模型类31 require_once MODEL.'UserModel.class.php';  //用户模型类32 require_once FRAME.'FactoryModel.class.php';//模型工厂类33 require_once FRAME.'BaseController.class.php'; //基础控制器类34 require_once CTRONLLER.$ctr.'.class.php';35 36 37 //实例化控制器38 $userCtr = new $ctr();39 40 $userCtr -> $a();

2卡塔尔(قطر‎ 常量的应用:

  后台首页调节器【App/Controller/Admin/IndexController.class.php】

澳门新葡萄京官网首页 3澳门新葡萄京官网首页 4

 1 <?php 2 /** 3  * IndexController控制器类 4  * 后台相关操作 5  * User: young 6  */ 7  8 class IndexController extends BaseController 9 {10     //展示后台首页11     public function index()12     {13         include VIEW.'index.html';14     }15 }

后台首页调节器引进视图路线改革

  顾客调整器
登入视图引进路线【App/Controller/Home/UserController.class.php】

澳门新葡萄京官网首页 5澳门新葡萄京官网首页 6

 1 <?php 2 /** 3  * UserController.class.php 用户控制器 4  */ 5  6 class UserController  extends  BaseController{ 7     /** 8      * 展示登录界面 9      * @access public10      */11     public function login()12     {13         include VIEW."login.html";14     }15 。。。16 。。。17 。。。

顾客调控器登陆视图引进路线

3)提交代码

$  git add -A$  git commit -m "常量使用"

以上多个门路所代表的情趣是相仿的即都访问同三个站点,带有相近的参数

活动加载类

二、写作小背景

  思路

  难题: 入口文件中已经require_once
引进6个类,既扩大多个供给引进一个,轻松疏漏,重复和失误。

  消灭形式:自动加载类文件

     格局1: 使用电动加载类函数__autoload(卡塔尔(قطر‎能够兑现机关加载
  方式2: 实际项目中,多个人支付,依据实用性,更加多的是运用
sql_autoload_register(卡塔尔国注册函数自动加载

  依据目录的天性实现活动加载
  Model类文件特点,以Model结尾的类名 substr($className,-5卡塔尔国
  Controller文件特点: 以Controller结尾的类名, substr($class,-10State of Qatar

    公共类:
类名未有统一式样,能够将Fame下的公共类放入到数组中,然后判别类是不是在数组中,
进而自动加载该目录下的类公事

  放松放松,来个小小的的接入,哈哈。由于目前希图搭建贰个mini型的顶级超小的框架(此处犯了情趣相符的语法错误,得零分,哈哈),狠抓与加强一下团结根基知识。以MVC格局开展搭建,所以就少不接触模型呀调控器呀行为等等的了。从前一贯用ThinkPHP,感到ThinkPHP中的UPRADOL中的暗中同意方式PATHINFO很刚劲。所以就调控营造一个如此的效应用于本人的小框架的UPAJEROL上啊。此前平素想去商讨一下ThinkPHP的原码,由于尚虎时间,到昨日都还尚无去执行。策画在这里个寒假里好好钻研一下以此框架的原码,硕士涯最终三个寒假啦。

  代码完结

  1) 入口文件落实类的机动加载

 1 <?php 2 /** 3  * 入口文件 4  */ 5 $p = !empty($_GET['p']) ? $_GET['p'] : 'Home';  //平台 6 $c = !empty($_GET['c']) ? $_GET['c'] : 'User';  //控制器 7 $a = !empty($_GET['a']) ? $_GET['a'] : 'login'; //动作 8  9 define('PLAT', $p);  //平台常量10 define('CTR', $c);  //控制器11 define('ACTION', $a); //动作12 13 14 define('DS', DIRECTORY_SEPARATOR); //目录分割符15 define('ROOT', getcwd;  //当前所在目录 项目目录16 define('FRAME', ROOT.'Frame'.DS);17 define('APP', ROOT.'App'.DS);18 define('PUB', ROOT.'Public'.DS);19 define('ADMIN', PUB.'Admin'.DS);20 define('HOME', PUB.'Home'.DS);21 22 //MVC目录23 define('MODEL', APP.'Model'.DS);24 define('VIEW', APP.'View'.DS.PLAT.DS.CTR.DS);25 define('CTRONLLER', APP.'Controller'.DS.PLAT.DS);26 27 $ctr = $c."Controller";28 29 spl_autoload_register('autoload'); //注册自动加载函数30 //自动加载类31 /**32  * 实自动加载类文件33  * @param  string $className 类名34  */35 function autoload($className)36 {37     $upperClassName = strtoupper($className);38     $frame = array('BaseController','BaseModel','Db','FactoryModel');39     if(in_array($className, $frame)) {  //加载公共Frame目录中的类文件40         require_once FRAME."$className.class.php";41     } elseif(substr($upperClassName, -5) == 'MODEL'){  //加载模型Model目录中的类文件42         require_once MODEL."$className.class.php";43     } elseif(substr($upperClassName, -10) == 'CONTROLLER'){  //加载控制器目录中的类文件44         require_once CTRONLLER."$className.class.php";45     }46 }47 48 //实例化控制器49 $userCtr = new $ctr();50 $userCtr -> $a();

2) 提交代码

1 $  git add -A2 $  git commit -m "自动加载类完成"

-为学须刚与恒,不刚则隋隳,不恒则退

优化进口文件

与大家共勉吧,百折不回便是success嘛!好啦扯远啦,言归正传,作者所创立的PATHINFO功能上和ThinkPHP是同一的,至于里面包车型地铁深层原理成效难点怎样的,是或不是和TP中的PATHINFO一样就不太领悟啊,终究尚未曾去研究TP原码,这里就遵照自身要好的思路来写。

  思路

  难题:
这时候,入口文件代码零碎加多,随着延续代码的增添,入口文件会越来越肥胖复杂,不易管理

  化解办法:
封装入口文件中的操作称为一个类,那样只须求在输入文件调用类的法子就能够

    创建Init.class.php类文件,放入到Frame中
   将进口文件全部操作封装成类方法
loadClass(State of Qatar 设置自动加载函数
autoload(卡塔尔国自动加载类
setConst(卡塔尔(قطر‎ 定义常量
dispatch(State of Qatar 前端分发器

三、所波及的骨干知识

  代码完成

  1State of Qatar 在Frame目录中创设Init.class.php文件,
将进口文件index中的代码复制举办改正为类

  【Frame/Init.class.php】

 1 <?php 2 /** 3  * 应用初始化操作类 4  * User: young 5  */ 6  7 class Init 8 { 9     protected static $frame = array('BaseController','BaseModel','Db','FactoryModel'); //Frame目录公共操作类10     public static function run()11     {12         //平台13         self::dispatch();14 15         //定义常量16         self::setConst();17 18         //自动加载类19         self::loadClass();20 21         $ctr = CTR."Controller";  //拼接控制器名称22 23         //实例化控制器24         $ctrObj = new $ctr();25         $a = ACTION;26         $ctrObj -> $a();27     }28     /**29      * 设置自动加载类方法30      */31     private static function loadClass()32     {33         spl_autoload_register('self::autoload');34     }35 36     /**37      * 实现自动加载38      * @param  string $className 类名39      */40     private static function autoload($className)41     {42         $upperClassName = strtoupper($className);43         if(in_array($className, static::$frame)) {44             require_once FRAME."$className.class.php";45         } elseif(substr($upperClassName, -5) == 'MODEL'){46             require_once MODEL."$className.class.php";47         } elseif(substr($upperClassName, -10) == 'CONTROLLER'){48             require_once CTRONLLER."$className.class.php";49         }50     }51 52     /**53      * 定义常量54      */55     private static function setConst()56     {57         define('DS', DIRECTORY_SEPARATOR); //目录分割符58         define('ROOT', getcwd().DS);59         define('FRAME', ROOT.'Frame'.DS);60         define('APP', ROOT.'App'.DS);61         define('PUB', ROOT.'Public'.DS);62         define('ADMIN', PUB.'Admin'.DS);63         define('HOME', PUB.'Home'.DS);64 65 66         define('MODEL', APP.'Model'.DS);67         define('VIEW', APP.'View'.DS.PLAT.DS.CTR.DS);68         define('CTRONLLER', APP.'Controller'.DS.PLAT.DS);69     }70 71     /**72      * 获取 p c a 的GET值,并设置为常量73      * @return void74      */75     private static function dispatch()76     {77         $p = !empty($_GET['p']) ? $_GET['p'] : 'Home';  //平台78         $c = !empty($_GET['c']) ? $_GET['c'] : 'User';  //控制器79         $a = !empty($_GET['a']) ? $_GET['a'] : 'login'; //动作80 81         define('PLAT', $p);82         define('CTR', $c);83         define('ACTION', $a);84     }85 }

2卡塔尔 入口文件引进开始化类,并调用其方法 【index.php】

1 <?php2 /**3  * 入口文件4  */5 6 require_once './Frame/Init.class.php';7 Init::run();

3卡塔尔 提交代码

1 $  git add -A2 $  git commit -m "优化入口文件,封装初始化类"

1、apache的rewrite模块。

康宁访谈项目目录

  接受apache的rewrite模块,将具备访谈那么些站点的路子都只可以从单一index.php入口步入。(由于apache重写法规也是一块硬骨头,在这里间就不实行来细讲啊,到时候再其余写一篇小说来计算那个重写法规,与大家一同相互学习学习。小编博客:)

  思路

  难点:
那时,项目中具有目录都以能够透过浏览器访谈的,如间接待上访谈Frame/Db.class.php文件
直接能够去查看数据库登陆音信,显明是不安全的。

  化解格局:

    方式1:
在能够访谈的公文开头处定义常量,访谈是推断是不是定义常量defined,
未有概念钦命常量则直接exit(‘Access Deny’卡塔尔;

    方式2: 开启遍布式权限配置,编写.htaccess文件, 如禁绝访问,
将该文件放置在明确命令禁绝访问的目录中

2、正则表达式

  实现

  1)使用上述方法2的样式来实现,
站点配置中参加一项(境况搭建时早就步入了): 详细见:
PHP源码搭建博客1-条件搭建

  apache配置文件httpd-vhosts.conf 中站点结构

1  #允许分布式权限配置2   AllowOverride All

  2) 重启apache后,编写 .htaccess文件, 该文件内容:

deny from all

  3) 将.htaccess文件放置禁绝访谈的目录中。 如App/ , Frame/
目录下。只用放在第一层就能够,内层目录自动不许直接访问。

澳门新葡萄京官网首页 7

  4State of Qatar 访谈测量试验

澳门新葡萄京官网首页 8

  正则表明式的基本知识、PHP中的preg_match(卡塔尔(قطر‎函数,这么些函数是创制这些作用的第一,所以须要珍视精通。

小结:

首要落成了 引进路线优化, 类的自行加载, 封装优化进口文件,目录访问限定

MVC微型框架到此基本到位。其实还可能有相当多也许可以世袭扩充,如

  1, 类文件命名此处都用了 .class.php结尾,
实质能够优化直接接纳.php结尾

  2, 引进命名空间,更低价的加载类

3, 项目中冒出谬误,这时候是平昔显示在浏览器上的,
能够写一个日志类,发生错误写入文件或数据库都可

  4, 数据库连接音讯此处是直接写在DB类和BaseModel中了, 是不安全的。
能够创立多个计划目录,将这个音信写入配置文件,再写三个加载配置文件的类。

  5. 此结构目录 ,是在C,V中分平台,如Controller/Home,
Controller/Admin; 实际也足以写成 平台下分MVC布局, 如Admin/Controller,
Admin/Model, Home/Controller,Home/View ..
这么些是比较灵敏的,能够依据要求选取特别适宜的情势

  实际上线项目,还是建议接受框架,安全快速;
本人模仿定义的框构造造契合学习商量选取,轻巧脱漏,变成安全隐患,操作困难等主题材料

下一步:依据博客前端模板,剖判创立数据表,
初叶搭建博客后台程序,后续首先准备实现“分类模块”。既分类的体现,修正,增加,删除作用

3、类公事的电动载入与路线难题

  在MVC形式中最功底且需求管理的便是M、C、A多个参数,那八个参数观念贯穿于一切方式代码中。在这地大家供给处理的便是U卡宴L,便是我们只须求通过路线的module、controller、action就可见显著所看望的哪些类哪个调节器以致作为。对于这一个类的对象object生成以至表现情势的调用都以机动的,没有供给我们别的再去编写代码一一管理。由此对此怎样精少将类文件载入以至调用方法是个很关键的步骤。PHP中内部自带有三个new
Object时自动触发的函数,那正是__autoload(卡塔尔,它扩充函数spl_autoload_register(卡塔尔注册自动加载函数。

  对于路线的难点,由于要求完结自动化即自动载入类文件等等,所以须要相对康健的载入路线代码,让其移植性强一点。比如在Window和Linux系统下能够一通百通,所以要求运用PHP中的三个魔术常量__DIR__来写路线代码。

四、景况认证

  Linux虚拟机、PHP5.3.6、域名www.test2.com

五、代码实例

1、创建好相应文件夹。尽管这些事例很粗大略然而大家也无法漫不经心过去,养成优秀的习贯,争取早入成为大神,哈哈

  这一个文件夹的话,随个人的主张来树立。如若用来框架上的话,这一步就显示很要紧呀。具体能够参见各种框架的文件目录布局。笔者的文件目录如下图:

  澳门新葡萄京官网首页 9

  才刚起头搭建的,目录很简陋,还未有周密哈,毕竟仍然生手等第,大神们勿喷,能够的话请,还请各位指导辅导哈。

  这里根本是突显一下本人的文本夹,方便下边包车型大巴知情剖判。那么些效果重借使Url.class.php文件。

2、开启apache的rewrite模块

  在对应的布置文件将其张开就好,这里就不上课了。

  接着在根目录建构.htaccess文件,这里最首就算放重写法则,如下所示:

1 <IfModule mod_rewrite.c>
2    RewriteEngine on
3    RewriteCond %{Request_FILENAME} !-f
4    RewriteRule !.(js|ico|gif|jpg|png|css)$ /index.php
5 </IfModule>

  轻松分析:1、RewriteEngine on
开启重写 2、RewriteRule
重写准则,表示非上述后缀的路径都密密匝匝  3、RewriteCond
 剖断是否文件

  这里的功效正是将富有访谈www.test2.com的门径都一定要index.php路线踏入,即为单一入口。

3、重要代码

Url.class.php

自身将此文件归入/Framework/Core文件夹中

  1 <?php
  2 /*
  3 *@作 者 :壹叶随风
  4 *@博 客 :http://www.cnblogs.com/phpstudy2015-6/
  5 *@时 间 :2017.1.3
  6 */
  7 class Url
  8 {
  9     //定义正则表达式常量
 10     const REGEX_ANY="([^/]+?)";                   #非/开头任意个任意字符
 11     const REGEx_INT="([0-9]+?)";                  #数字
 12     const REGEX_ALPHA="([a-zA-Z_-]+?)";           #字母
 13     const REGEX_ALPHANUMERIC="([0-9a-zA-Z_-]+?)"; #任意个字母数字_-
 14     const REGEX_STATIC="%s";                      #占位符
 15     const ANY="(/[^/]+?)*";                       #任意个非/开头字符
 16 
 17     protected $routes=array(); #保存路径正则表达式
 18 
 19     #添加路由正则表达式
 20     public function addRoute($route)
 21     {
 22         $this->routes[]=$this->_ParseRoute($route);
 23     }
 24 
 25     /*private
 26       @input :$route 输入路由规则
 27       @output:return 返回路由正则规则
 28     */
 29     private function _ParseRoute($route)
 30     {
 31         $parts=explode("/", $route);  #分解路由规则
 32         $regex="@^";  #开始拼接正则路由规则
 33         if(!$parts[0])
 34         {
 35             array_shift($parts);  #除去第一个空元素
 36         }
 37         foreach ($parts as $part) 
 38         {
 39             $regex.="/";
 40             $args=explode(":",$part);
 41             if(!sizeof($args)==2)
 42             {
 43                 continue;
 44             }
 45             $type=array_shift($args);
 46             $key=array_shift($args);
 47             $this->_normalize($key);  #使参数标准化,排除其他非法符号
 48             $regex.='(?P<'.$key.'>';    #为了后面preg_match正则匹配做铺垫
 49             switch (strtolower($type)) 
 50             {
 51                 case 'int':      #纯数字
 52                     $regex.=self::REGEX_INT;
 53                     break;
 54                 case 'alpha':    #纯字母
 55                     $regex.=self::REGEX_ALPHA;
 56                     break;
 57                 case 'alphanum':  #字母数字
 58                     $regex.=self::REGEX_ALPHANUMBERIC;
 59                     break;
 60                 default:
 61                     $regex.=$type; #自定义正则表达式
 62                     break;
 63             }
 64             $regex.=")";
 65         }
 66         $regex.=self::ANY;   #其他URL参数
 67         $regex.='$@u';
 68         return $regex;
 69     }
 70 
 71     /*public,将输入的URL与定义正则表达式进行匹配
 72       @input  :$request 输入进来的URL
 73       @output :return 成功则输出规则数组数据 失败输出false
 74     */
 75     public function getRoute($request)
 76     {
 77         #处理request,进行参数处理,不足M、C、A,则自动补为home、index、index,即构建MVC结构URL
 78         $request=rtrim($request,'/');           #除去右边多余的斜杠/
 79         $arguments=explode('/',$request);
 80         $arguments=array_filter($arguments);    #除去数组中的空元素
 81         $long=sizeof($arguments);               #数组中的个数
 82         switch ($long)                          #判断个数,不足就补够
 83         {
 84             case '0':
 85                 $request='/home/index/index';
 86                 break;
 87             case '1':
 88                 $request.='/index/index';
 89                 break;
 90             case '2':
 91                 $request.='/index';
 92                 break;
 93         }       
 94         $matches=array();                       #定义匹配后存贮的数组
 95         $temp=array();                          #中间缓存数组
 96         
 97         foreach ($this->routes as $v)           #开始匹配
 98         {
 99             preg_match($v, $request, $temp);    #需要重点理解这个数组
100             $temp?$matches=$temp:'';
101         }
102         if($matches)                            #判断$matches是否有数据,无返回false
103         {
104             foreach ($matches as $key => $value) #筛选
105             {
106                 if(is_int($key))
107                 {
108                     unset($matches[$key]);      #除去数字key元素,保留关联元素。与上面的preg_match一起理解
109                 }
110             }
111             $result=$matches;
112             if($long > sizeof($result))         #URL参数超过后的处理
113             {
114                 $i=1;
115                 foreach ($arguments as $k => $v) 
116                 {                      
117                     if($k > sizeof($result))
118                     {
119                         if($i==1)
120                         {
121                             $result[$v]='';
122                             $temp=$v;
123                             $i=2;
124                         }
125                         else
126                         {
127                             $result[$temp]=$v;
128                             $i=1;
129                         }                           
130                     }
131                 }
132             }
133             return $result;
134         }
135         return false;
136     }
137     #使参数标准化,不能存在符号,只能是a-zA-Z0-9组合
138     private function _normalize(&$param)
139     {
140         $param=preg_replace("/[^a-zA-Z0-9]/", '', $param);
141     }
142 }
143 /*使用实例:
144 include './Url.class.php';
145 $router=new Url();
146 $router->addRoute("/alpha:module/alpha:controller/[0-9]+?:a1a");
147 $router->addRoute("/alpha:module/alpha:controller/alpha:action"); 
148 $router->addRoute("/alpha:module/alpha:controller/alpha:action/(www[0-9]+?):id"); 
149 $url=$_SERVER['REQUEST_URI'];
150 $urls=$router->getRoute($url); 
151 echo "<pre>";
152 print_r($urls);
153 echo "</pre>";
154 */
155 ?>

代码作用拆解深入分析:

  上边这些Url.class.php类文件代码大约能够分为两某个,在75行即方法getRoute那一个地点可以将其分为上半部分和下半部分。

  上半有个别是办法addRoute,是用来加多路线正则表达式的,并将其储备在类属性$routes里。

  下半某些是办法getRoute,是用来同盟处理访问路线的。将在访谈的门径传进来,再与$routes里面包车型地铁正则表明式举行相称,成功后再进一层管理,重返管理结果。

  针对地点的Url.class.php类文件,大家得以在根目录创建三个test.php测验文件只怕直接在index.php文件上测量试验(方便急忙),协理大家更为驾驭那么些类公事的规律与功力。(这里自身就不树立test文件啦,直接在index.php文件上拓宽测验啦)

测试一:

index.php代码如下

1 <?php
2 include "./Framework/Core/Url.class.php";   #载入类文件
3 $router=new Url();
4 #添加规则
5 $router->addRoute("/alpha:module/alpha:controller/alpha:action"); 
6 ?>

再在Url.class.php的addRoute方法中加多三个输出,用来考查,如下图:

澳门新葡萄京官网首页 10

始发拜见:

结果:

澳门新葡萄京官网首页 11

小结:

  1、很分明,输出的类属性$routes里面存贮的是正则表明式。

  2、私有方法_ParseRoute中,调用了_normalize(State of Qatar方法管理$key,那几个方式便是将$key除a-zA-Z0-9以外的标志过滤掉。

  3、正则表达式中,【P<‘.$key.’>】,是用来后边的preg_match相配用的,后边讲明。

  4、switch中,正是非常选用正则表明式,能够是现已定义好的,也能够是和谐所写。比方:

      int代表self::REGEX_INT即正则表明为=》([0-9]+?)

       alpha代表self::REGEX_ALPHA即正则表达式=》([a-zA-Z_-]+?)

   
  alphanum代表self::REGEX_ALPHANUMBERIC=》([0-9a-zA-Z_-]+?)

      (正则表明式State of Qatar代表行使本身所写的公布式=》举个例子:(www[0-9]+?)

  因而增添正则路劲addRoute的参数方式:【/int:module/阿尔法:controller/阿尔法num:action/(www[0-9]+?卡塔尔:id】大肆组合(无数个都得以),冒号前面包车型客车参数与preg_match协同利用,前边解说。

  5、$regex.=self::ANY;
这里的效果是用来相称URubiconL路劲其余参数用的,即

测量检验一停止后,将Url.class.php类文件恢复原状!

测试二:

index.php代码改过如下:

 1 <?php
 2 header("content-type:text/html;charset=utf8");
 3 include "./Framework/Core/Url.class.php";   #载入类文件
 4 $router=new Url();
 5 #添加规则
 6 $router->addRoute("/alpha:module/alpha:controller/[0-9]+?:a1a");
 7 $router->addRoute("/alpha:module/alpha:controller/alpha:action"); 
 8 $router->addRoute("/alpha:module/alpha:controller/alpha:action/(www[0-9]+?):id");
 9 $url=$_SERVER['REQUEST_URI'];
10 echo "<pre>";
11 echo "index.php第一个输出<br/>";
12 print_r($url);
13 echo "</pre>";
14 $urls=$router->getRoute($url); 
15 echo "<pre>";
16 echo "index.php getRoute输出结果 第五个输出<br/>";
17 print_r($urls);
18 echo "</pre>";die;
19 ?>

再在Url.class.php的getRoute方法中增加以下输出:

  第四个出口,用来查阅四个正则表明式时$routes的值,如下图:

澳门新葡萄京官网首页 12

  第四个出口,如下图

澳门新葡萄京官网首页 13

  第五个出口,如下图

澳门新葡萄京官网首页 14

  三、四输出是用来查阅掌握preg_match(State of Qatar函数用的

起头拜见:

结果与总计:

  1、输出一

澳门新葡萄京官网首页 15

  此处须要领会体会$_SERVER

  2、输出二

澳门新葡萄京官网首页 16

  当七个门路时,将会整整保存在$routes中

  3、输出三与四

澳门新葡萄京官网首页 17

  这里须求注重批注preg_matches()功能。

 

注意:

  当使用 PCRE
函数的时候,方式须求由分隔符闭合包裹。分隔符能够使大肆非字母数字、非反斜线、非空白字符。假使分隔符日常在
格局内冒出, 三个更加好的挑精拣肥正是是用其余分隔符来升高可读性。

  由此能够领略$routes中的值@的意思了,就是分隔符,只是我们平日用/而已。

  preg_matches(State of Qatar第一参数为正则表明式,此处我们将$routes中的归入进去。

  preg_matches(卡塔尔国第二参数为索要同盟的数据,这里大家将盛传进来的UGL450L放进去(此处U卡宴L是输出一的值)。

  preg_matches(卡塔尔第二参数为不须求参数,填了此参数,则将协作成功的值全体放入这些数组中。

  preg_matches(卡塔尔国在PHP5.2.2是增创了一个小语法,在那间小语法很珍视。

澳门新葡萄京官网首页 18

  即使使用了那些小语法(?P<name>卡塔尔(قطر‎,要是那几个子组相配了的话,那么它会将相配的数目与这一个name参数产生一对关联成分,存贮于preg_matches(卡塔尔国的第三参数数组中。这就很好的解释上述addRoute(卡塔尔的参数冒号后的值为啥用了,以至澳门新葡萄京官网首页 19的用法。

特别注意:

  foreach相称时,假设$routes含有两个正则表示式时,它将会按顺序贰个二个表达式的与U奥迪Q5L相配,若都非常成功,那么后边的将会覆盖前边的值。

  4、输出五

澳门新葡萄京官网首页 20

  这里正是getRoute(卡塔尔国方法管理U宝马X5L重临的结果。

测量检验结束供给将Url.class.php文件苏醒原样

到此处整个Url.class.php类文件讲解分析达成,接下去正是MVC的拜望啦。

上边借使简要介绍自动载入类文件,生成对象,并调用方法。

能够看看上边的文件目录来精通上面包车型客车逐条文件。

index.php文件

 1 <?php
 2 include './Framework/Core/Core.php';
 3 
 4 $router=new Url();
 5 $router->addRoute("/alpha:module/alpha:controller/[0-9]+?:a1a");
 6 $router->addRoute("/alpha:module/alpha:controller/alpha:action"); 
 7 $router->addRoute("/alpha:module/alpha:controller/alpha:action/(www[0-9]+?):id");
 8 
 9 $url=$_SERVER['REQUEST_URI'];
10 $urls=$router->getRoute($url); 
11 $_GET['urls']=$urls;
12 $m=$urls['module'];
13 $c=$urls['controller'];
14 $a=$urls['action'];
15 if($m&&$c)
16 {
17     $autoload=new Autoload($m,$c);
18     $autoload->PutFile();
19 }
20 $object=new $c;
21 $object->$a();
22 
23 ?>

/Framework/Core/Core.php

1 <?php
2 #核心文件
3 #载入PHP自动加载函数文件
4 include_once(__DIR__."/../Function/AutoLoad.function.php");
5 ?>

/Framework/Function/AutoLoad.function.php

 1 <?php
 2 #用于加载核心文件
 3 spl_autoload_register('CoreFunction');
 4 function CoreFunction($classname)
 5 {
 6     $file=__DIR__."/../Core/".$classname.".class.php";
 7     if(is_file($file))
 8     {
 9         require_once($file);
10     }    
11 }
12 ?>

/Framework/Core/Autoload.class.php

 1 <?php
 2 #用于加载控制器文件
 3 class Autoload
 4 {
 5     private $path='';
 6     public function __construct($module,$controller)
 7     {
 8         $this->path=__DIR__."/../../Application/".$module."/Controller/".$controller."Controller.class.php";
 9     }
10     public function PutFile()
11     {
12         if(is_file($this->path)) #判断文件是否存在
13         {
14             require_once($this->path);
15         } 
16         else
17         {
18             return false;
19         }
20     }
21 }
22 
23 ?>

还应该有四个模块里面包车型地铁调整器文件

Home中的TestController.class.php

 1 <?php
 2 class Test
 3 {
 4     public $aa=2;
 5     public function action()
 6     {
 7         echo "home---->test----->action";
 8         echo "<pre>";
 9         print_r($_GET);
10         echo "</pre>";
11     }
12 }

Admin中的TestController.class.php

 1 <?php
 2 class Test
 3 {
 4     public $aa=2;
 5     public function action()
 6     {
 7         echo "admin---->test----->action";
 8         echo "<pre>";
 9         print_r($_GET);
10         echo "</pre>";
11     }
12 }

起来拜访:

1、

结果为:

澳门新葡萄京官网首页 21

2、

结果为:

澳门新葡萄京官网首页 22

劳苦功高告成,码字码到手都累啊。这里U劲客L路线是尚未管理大小写的,所以module、controller、action皆以对大小写敏感的。

多或多或少考虑、多一点切磋、多一点敲代码,争取早日腾飞大神行列!

下一遍计划将它改成存款和储蓄式的,将addRoute的存入在$routes的正则路线存贮在文件中,getRoute用的时候再抽出来。再用apache的ab举办压力测量试验。

 

(以上是友好的一部分思想,若有不足恐怕失实的地点请各位提出)

作者:那一叶随风

声称:本博客文章为原创,只象征自己在做事学习中某一时间内总括的眼光或结论。转载时请在小说页面显著地点给出原来的小说链接。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注