侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

PHP仿tp实现mvc框架基本设计思路与实现方法分析

php  /  管理员 发布于 7年前   201

本文实例讲述了PHP仿tp实现mvc框架基本设计思路与实现方法。分享给大家供大家参考,具体如下:

仿tp mvc基本设计与简单实现

一:文件加载常识

变量 常量 函数 类
文件加载的函数或者使用命名空间:require();   require_once();   include();   include_once();
常量:define("DEFINE","");   const constant = "value";
函数:function fun(){}  // global 使用全局变量    局部变量不被外部调用。
类:

a; // 输出属性.  }  public function __construct(){ // 构造方法,实例化后自动执行,    echo $this->bb(); // 调用方法。  }  public function bb(){    echo "我是bb";  }}$a = new A;$a->aa();class B extends A{ // 继承 A ,类A是类B的父级。继承public的,}$b = new B;$b->aa(); // 可以输出类A里面的属性。

工厂模式参阅:140658.htm

//-----------------------------工厂模式-------------------------//class A{  public $class;   // public $class = $_GET['c']; //类名  public $method; // public $method = $_GET['m']; //方法  public function __construct($class,$method){    // 或者通过 $_SERVER['PATH_INFO']; 转换得到类名或者方法名(下面讲解)。    $this->class = ucfirst(strtolower($class)).'Controller'; //对类名进行安全处理,并加上控制器后缀    $this->method = strtolower($method);   //对方法名进行安全处理    $this->work($this->class,$this->method);  }  public function work($class,$method){    // 把文件命名成 (类名.class.php的形式),就可以通过类名找到文件。    //include '文件名(文件在别的地方)';    #例如 include './index.php'; 引入文件然后实例化类。    $c = new $class;  //实例化类    $c->$method();  //访问类的方法  }}

至此我们可以通过url的 $_GET 参数来解决

例如:http://mvc.com/index.php?h=home&v=Index&c=index.html

h为前后台,v为控制器,c为模板。

$v = $_GET['v'];$c = rtrim($_GET['c'],".html");new A($v,$c); // 根据继承关系再次加载文件。// extract($arr);  //extract 的作用:从数组中将变量导入到当前的符号表,键做变量,值做值!// compact(); // ― 建立一个数组,包括变量名和它们的值// assign display 实现参阅:140661.htm
class Controller{  public $array;  public $key;  public $val;  public function assign($key,$val){    if(array($val)){      $this->array["$key"] = $val;    }else{      $this->array["$key"] = compact($val);    }  }  public function display($tpl = ''){ // 模板为空自动加载。    $this->assign($this->key,$this->val);    extract($this->array);    // 如果模板为空就在这里根据get参数添加或者通过 $_SERVER['PATH_INFO']; 转换得到。(下面讲解)    if(file_exists($tpl)){ //模板存在就加载文件。      include $tpl;    }  }}//继承总model。这个model名字和控制器model的名字是一样的。继承方法同Controller,总model必须需要加上一个return。数据处理的indexmodel可以加return,也可以不加。class IndexModel extends Model{  public function index(){    // 数据处理。    // 需要返回数据就加上return。  }}class IndexController extends Controller{ // 继承  public function index(){    $m = Model("index");    echo '实例化后的index方法
'; $this->assign('m',$m); // 分配数据。 $this->display('index.html'); // 模板 }}

mvc虽然实现但是不够人性化,因为每次都要加上get参数,变得很冗长,解决的关键在于$_SERVER['PATH_INFO'];

用这个替换掉h m v三个参数。

1. 当输入url为:http://mvc.com/index.php/home/index/index.html
    这种情况下  index.php 斜线后面的apache会自动认为是一个路径。
    $_SERVER['PATH_INFO'] =  /home/index/index.html
    第1个斜线 /home        前后台
    第2个斜线 /index        控制器
    第3个斜线 /index.html  模板文件
    如果后面加有参数例如:?a=18&b=38   他不会被加到$_SERVER['PATH_INFO']里面。$_POST 或者 $_GET 也不会加入$_SERVER['PATH_INFO']里面的内容,这样就可以让控制参数和数据的参数互不冲突。

2. U 方法的实现。重新改写$_SERVER['PATH_INFO'] 参数,改变为一个数据。array( 'home', 'Index', 'index');

每次进入入口文件index.php都把他的PHP_INFO参数转换为数组,在控制器或者其他的地方只要调用这个参数就行了。

// 这里如果做了大小写的转换,总控制器里面就不用了。function bca(){  $arr = explode('/',ltrim($_SERVER['PATH_INFO'],'/'));  if(count($arr) == 3){    $arr[0] = strtolower($arr[0]);    $arr[1] = ucfirst(strtolower($arr[1]));    // 判断后缀是不是 .html    if(substr($arr[2],-5,strlen($arr[2])) == '.html'){      $a = explode('.',$arr['2']);      $arr[2] = strtolower($a[0]);    }else{      $arr[2] = strtolower($arr[2]);    }    $_SERVER['PATH_INFO'] = $arr;  }}// url方法做控制器或前后台的跳转。第三个参数是输出还是return。默认是直接输出。function U($string = '',$method = '',$bool = true){ // true 是直接输出或者返回,  // 获取系统变量。  $path_info = $_SERVER['PATH_INFO'];  $script_name = $_SERVER['SCRIPT_NAME'];  // 判断中间有没有 / 以确定参数个数。  if(strpos($string,'/')){    $arr = explode('/',$string);    if(count($arr) == 2){  // 两个参数的情况。      $arr[0] = ucfirst(strtolower($arr[0]));      $arr[1] = strtolower($arr[1]);      $url = "/{$path_info[0]}/{$arr[0]}/{$arr[1]}.html";    }else if(count($arr) == 3){ // 三个参数的情况。      $arr[0] = strtolower($arr[0]);      $arr[1] = ucfirst(strtolower($arr[1]));      $arr[2] = strtolower($arr[2]);      $url = "/{$arr[0]}/{$arr[1]}/{$arr[2]}.html";    }  }else{    $arr = strtolower($string); // 一个参数的情况。    $url = "/{$path_info[0]}/{$path_info[1]}/{$arr}.html";  }  // url 路径的拼接。  if($method != ''){    $u = $script_name.$url.'?'.$method;    if($bool == true){     echo $u;    }else{     return $u;   }  }else{    $u = $script_name.$url;    if($bool == true){     echo $u;    }else{     return $u;   }  }}

3. url重写,去掉 index.php

打开apache配置文件重写模块,LoadModule rewrite_module modules/mod_rewrite.so

根下加入的改写文件  .htaccess

内容:

 Options +FollowSymlinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]

在浏览器输入url:http://mvc.com/home/index/index.html?a=19b=38
    [REDIRECT_STATUS] => 200  重写状态ok。

发现 $_SERVER['REDIRECT_URL']; 和 $_SERVER['PATH_INFO']; 参数相同。所以参数后面就可以去掉index.php这安全的问题。

4. 模板替换(思路)

我们会发现有一个我们书写的模板,里面有 {$arr}  等,我们把模板文件读取后通过正则还有字符串把他转换成正常的php文件。对文件名加密后放到替换后的文件夹下,每次url访问的时候查看是否有缓存文件,判断最后修改时间等验证,

5. 数据缓存(思路)

json_encode() json_decode() file_get_contents() file_put_contents(); unserialize();  serialize(); 等存文文件里面或者memcache redis 等存储。

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

您可能感兴趣的文章:

  • PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
  • PHP从零开始打造自己的MVC框架之入口文件实现方法详解
  • php打造属于自己的MVC框架
  • PHP的MVC模式实现原理分析(一相简单的MVC框架范例)
  • php实现最简单的MVC框架实例教程
  • php实现简单的MVC框架实例
  • 搭建自己的PHP MVC框架详解
  • PHP简单的MVC框架实现方法
  • PHP MVC框架路由学习笔记
  • PHP URL路由类实例
  • php编写一个简单的路由类
  • PHP从零开始打造自己的MVC框架之路由类实现方法分析


  • 上一条:
    PHP实现一维数组与二维数组去重功能示例
    下一条:
    PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客