仿tp mvc基本设计与简单实现
2015-04-13 11:46
232 查看
<?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])); // 判断后缀是不是 .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 内容: <IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ 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 等存储。
相关文章推荐
- ASP.NET MVC 搭建简单网站 --1.前端页面布局和基本样式实现
- PHP仿tp实现mvc框架基本设计思路与实现方法分析
- 手写Spring基本体系IOC+AOP+MVC+事物管理等简单实现。
- C++版的坦克大战(1)---实现基本设计和j简单思想
- go实现一个简单的游戏服务器框架(lotou)基本设计
- 使用三层架构实现简单的MVC登陆操作!并实现基本的增删改查功能!!
- Golanger Web Framework(框架简单实现了MVC的设计方式)
- 8_14 日学到的新知识(简单的工厂模式的实现, MVC 模式的基本概念,软件工程中的四种开发模型, 以及软件工程中的一些小知识点)
- (随记八)Android设计模式解析与实战_自由扩展项目_Builder模式_定义与简单实现
- 【远程调用框架】如何实现一个简单的RPC框架(五)优化三:软负载中心设计与实现
- Asp.net MVC 自定义ViewEngine的简单实现
- Spring+SpringMVC+Hiberate+MySql+Bootstrap实现一个简单验证登录实例
- MVC开发之排球计分(三)模型类与设计的实现
- MVC简单实现插件Demo-从底层理解MVC路由匹配浏览器请求的URL
- 一个简单的基于注解的 Controller (spring 2.5 annotation 方式实现mvc )
- android网游开发之socket的简单设计和实现
- 设计一条简单的等待工作队列之软件模型设计与实现(二)
- 使用EF6和MVC5实现一个简单的选课系统--使用EF6实现基本的GRUD功能(2/12)
- 用例子说明MVC 设计模式(以Objective-C 实现)
- MVC实战之排球计分(四)—— View设计与实现