当前位置:首页 > PHP教程 > php高级应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-09-17 19:14:25 浏览: 评论:0 

这篇文章主要介绍了PHP仿tp实现mvc框架基本设计思路与实现方法,简单讲述了php实现tp框架的原理,并结合实例形式分析了相关控制器、视图及URL访问操作技巧与注意事项,需要的朋友可以参考下。

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

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

一:文件加载常识

变量 常量 函数 类

文件加载的函数或者使用命名空间:require();   require_once();   include();   include_once();

常量:define("DEFINE","");   const constant = "value";

函数:function fun(){}  // global 使用全局变量    局部变量不被外部调用。

类:

  1. <?php 
  2. class A{ 
  3.   public $a = 10; 
  4.   public function aa(){  // 不能使用一个a是因为,new A 之后 方法a会被自动执行,所以方法名不可以和类名冲突。 
  5.     echo $this->a; // 输出属性. 
  6.   } 
  7.   public function __construct(){ // 构造方法,实例化后自动执行, 
  8.     echo $this->bb(); // 调用方法。 
  9.   } 
  10.   public function bb(){ 
  11.     echo "我是bb"
  12.   } 
  13. $a = new A; 
  14. $a->aa(); 
  15. class B extends A{ // 继承 A ,类A是类B的父级。继承public的, 
  16. $b = new B; 
  17. $b->aa(); // 可以输出类A里面的属性。 

工厂模式参阅:

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

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

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

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

  1. $v = $_GET['v']; 
  2. $c = rtrim($_GET['c'],".html"); 
  3. new A($v,$c); // 根据继承关系再次加载文件。 
  4. // extract($arr);  //extract 的作用:从数组中将变量导入到当前的符号表,键做变量,值做值! 
  5. // compact(); // — 建立一个数组,包括变量名和它们的值 
  6. // assign display 实现参阅:https://www.jb51.net/article/140661.htm 
  7.  
  8. class Controller{ 
  9.   public $array
  10.   public $key
  11.   public $val
  12.   public function assign($key,$val){ 
  13.     if(array($val)){ 
  14.       $this->array["$key"] = $val
  15.     }else
  16.       $this->array["$key"] = compact($val); 
  17.     } 
  18.   } 
  19.   public function display($tpl = ''){ // 模板为空自动加载。 
  20.     $this->assign($this->key,$this->val); 
  21.     extract($this->array); 
  22.     // 如果模板为空就在这里根据get参数添加或者通过 $_SERVER['PATH_INFO']; 转换得到。(下面讲解) 
  23.     if(file_exists($tpl)){ //模板存在就加载文件。 
  24.       include $tpl
  25.     } 
  26.   } 
  27. //继承总model。这个model名字和控制器model的名字是一样的。继承方法同Controller,总model必须需要加上一个return。数据处理的indexmodel可以加return,也可以不加。 
  28. class IndexModel extends Model{ 
  29.   public function index(){ 
  30.     // 数据处理。 
  31.     // 需要返回数据就加上return。 
  32.   } 
  33. class IndexController extends Controller{ // 继承 
  34.   public function index(){ 
  35.     $m = Model("index"); 
  36.     echo '实例化后的index方法<br>'
  37.     $this->assign('m',$m); // 分配数据。 
  38.     $this->display('index.html'); // 模板 
  39.   } 

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参数转换为数组,在控制器或者其他的地方只要调用这个参数就行了。

  1. // 这里如果做了大小写的转换,总控制器里面就不用了。 
  2. function bca(){ 
  3.   $arr = explode('/',ltrim($_SERVER['PATH_INFO'],'/')); 
  4.   if(count($arr) == 3){ 
  5.     $arr[0] = strtolower($arr[0]); 
  6.     $arr[1] = ucfirst(strtolower($arr[1])); 
  7.     // 判断后缀是不是 .html 
  8.     if(substr($arr[2],-5,strlen($arr[2])) == '.html'){ 
  9.       $a = explode('.',$arr['2']); 
  10.       $arr[2] = strtolower($a[0]); 
  11.     }else
  12.       $arr[2] = strtolower($arr[2]); 
  13.     } 
  14.     $_SERVER['PATH_INFO'] = $arr
  15.   } 
  16. // url方法做控制器或前后台的跳转。第三个参数是输出还是return。默认是直接输出。 
  17. function U($string = '',$method = '',$bool = true){ // true 是直接输出或者返回, 
  18.   // 获取系统变量。 
  19.   $path_info = $_SERVER['PATH_INFO']; 
  20.   $script_name = $_SERVER['SCRIPT_NAME']; 
  21.   // 判断中间有没有 / 以确定参数个数。 
  22.   if(strpos($string,'/')){ 
  23.     $arr = explode('/',$string); 
  24.     if(count($arr) == 2){  // 两个参数的情况。 
  25.       $arr[0] = ucfirst(strtolower($arr[0])); 
  26.       $arr[1] = strtolower($arr[1]); 
  27.       $url = "/{$path_info[0]}/{$arr[0]}/{$arr[1]}.html"
  28.     }else if(count($arr) == 3){ // 三个参数的情况。 
  29.       $arr[0] = strtolower($arr[0]); 
  30.       $arr[1] = ucfirst(strtolower($arr[1])); 
  31.       $arr[2] = strtolower($arr[2]); 
  32.       $url = "/{$arr[0]}/{$arr[1]}/{$arr[2]}.html"
  33.     } 
  34.   }else
  35.     $arr = strtolower($string); // 一个参数的情况。 
  36.     $url = "/{$path_info[0]}/{$path_info[1]}/{$arr}.html"
  37.   } 
  38.   // url 路径的拼接。 
  39.   if($method != ''){ 
  40.     $u = $script_name.$url.'?'.$method
  41.     if($bool == true){     echo $u;    }else{     return $u;   } 
  42.   }else
  43.     $u = $script_name.$url
  44.     if($bool == true){     echo $u;    }else{     return $u;   } 
  45.   } 

3. url重写,去掉 index.php

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

根下加入的改写文件  .htaccess

内容:

  1. <IfModule mod_rewrite.c> 
  2.  Options +FollowSymlinks 
  3.  RewriteEngine On 
  4.  RewriteCond %{REQUEST_FILENAME} !-d 
  5.  RewriteCond %{REQUEST_FILENAME} !-f 
  6.  RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 
  7. </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 等存储。

Tags: PHP仿tp mvc框架

分享到: