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

2024-05-23 23:38
文章标签 简单 实现 设计 基本 mvc tp

本文主要是介绍仿tp mvc基本设计与简单实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

<?php
// ===============================------仿tp mvc基本设计与简单实现-----------=======================
一:文件加载常识。
变量 常量 函数 类
文件加载的函数或者使用命名空间:require();   require_once();   include();   include_once();
常量:define("DEFINE","");   const constant = "value";
函数:function fun(){}  // global 使用全局变量    局部变量不被外部调用。
类:
class A{public $a = 10;public function aa(){    // 不能使用一个a是因为,new A 之后 方法a会被自动执行,所以方法名不可以和类名冲突。echo $this->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里面的属性。===============================================================
工厂模式参阅:http://blog.csdn.net/u010861514/article/details/41269513
===============================================================
//-----------------------------工厂模式-------------------------//  
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 实现参阅:http://blog.csdn.net/u010861514/article/details/40869179
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方法<br>';$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]));// 判断后缀是不是 .htmlif(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
内容:
<IfModule mod_rewrite.c>Options +FollowSymlinksRewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>在浏览器输入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}  <include file="" /> 等,我们把模板文件读取后通过正则还有字符串把他转换成正常的php文件。对文件名加密后放到替换后的文件夹下,每次url访问的时候查看是否有缓存文件,判断最后修改时间等验证,5,数据缓存(思路)
json_encode() json_decode() file_get_contents() file_put_contents(); unserialize();  serialize(); 等存文文件里面或者memcache redis 等存储。

这篇关于仿tp mvc基本设计与简单实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/996752

相关文章

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

golang版本升级如何实现

《golang版本升级如何实现》:本文主要介绍golang版本升级如何实现问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录golanwww.chinasem.cng版本升级linux上golang版本升级删除golang旧版本安装golang最新版本总结gola

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU