• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PHP仿tp实现mvc框架基本设计思路与实现方法分析

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

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

    一:文件加载常识

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

    ?php
    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里面的属性。
    
    

    工厂模式参阅:https://www.jb51.net/article/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=homev=Indexc=index.html

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

    $v = $_GET['v'];
    $c = rtrim($_GET['c'],".html");
    new A($v,$c); // 根据继承关系再次加载文件。
    // extract($arr);  //extract 的作用:从数组中将变量导入到当前的符号表,键做变量,值做值!
    // compact(); // — 建立一个数组,包括变量名和它们的值
    // assign display 实现参阅:https://www.jb51.net/article/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方法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=18b=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 等存储。

    更多关于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自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
    下一篇:yii2安装详细流程
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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