亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP仿tp實現mvc框架基本設計思路與實現方法分析

2024-05-05 00:03:50
字體:
來源:轉載
供稿:網友

本文實例講述了PHP仿tp實現mvc框架基本設計思路與實現方法。分享給大家供大家參考,具體如下:

仿tp mvc基本設計與簡單實現

一:文件加載常識

變量 常量 函數 類
文件加載的函數或者使用命名空間:require();   require_once();   include();   include_once();
常量:define("DEFINE","");   const constant = "value";
函數:function fun(){}  // global 使用全局變量    局部變量不被外部調用。
類:

<?phpclass 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://www.49028c.com/kaifa/php/310377.html

//-----------------------------工廠模式-------------------------//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://www.49028c.com/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=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 等存儲。

希望本文所述對大家PHP程序設計有所幫助。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色青青草原桃花久久综合| 亚洲一区二区三| xxx一区二区| 午夜精品国产精品大乳美女| 欧美一级大片在线免费观看| 91大神福利视频在线| 日韩综合视频在线观看| 日本精品中文字幕| www日韩中文字幕在线看| 成人国产精品久久久久久亚洲| 精品一区二区三区电影| 91av在线影院| 78m国产成人精品视频| 国产精品欧美风情| 久久精品国产69国产精品亚洲| 国产欧美精品va在线观看| 成人欧美一区二区三区黑人孕妇| 成人444kkkk在线观看| 久久国产精品99国产精| 亚洲一区二区三区乱码aⅴ蜜桃女| 高清亚洲成在人网站天堂| 91亚洲精品一区二区| 欧美国产高跟鞋裸体秀xxxhd| 亚洲国产美女精品久久久久∴| 亚洲国内高清视频| 热99精品里视频精品| 狠狠躁夜夜躁人人爽天天天天97| 国产精品∨欧美精品v日韩精品| 亚洲久久久久久久久久| 久久久久久久影视| 97在线视频国产| 色无极亚洲影院| 欧美性色19p| 亚洲国产精品va在线| 久久精品国产清自在天天线| 国产欧美va欧美va香蕉在线| 欧美日韩亚洲国产一区| 亚洲成人精品久久久| 精品国产91久久久久久| 欧美日韩国产中文精品字幕自在自线| 国产精品日韩精品| 亚洲网站在线看| 久久久久久中文字幕| 亚洲影院色无极综合| 欧美国产第二页| 午夜精品视频在线| 成人xxxx视频| 中文字幕欧美日韩精品| 欧美日韩一区二区免费视频| 日韩视频免费中文字幕| 欧美精品videosex牲欧美| 亚洲男人第一网站| 久久99精品久久久久久噜噜| 搡老女人一区二区三区视频tv| 欧美另类老肥妇| 国产suv精品一区二区三区88区| 人人澡人人澡人人看欧美| 国外成人免费在线播放| 久久免费少妇高潮久久精品99| 亚洲国产精品va| 国产精品成人免费电影| 一本色道久久综合狠狠躁篇的优点| 欧美成人免费在线观看| 欧美猛少妇色xxxxx| 久久久中精品2020中文| 久久亚洲精品中文字幕冲田杏梨| 亚洲精品有码在线| 日韩一二三在线视频播| 97精品国产97久久久久久春色| 久久国产精彩视频| 日韩女优人人人人射在线视频| 国产精品盗摄久久久| 国产成人中文字幕| 91精品视频播放| 亚洲欧美国内爽妇网| 欧美极品少妇xxxxⅹ免费视频| 欧美亚洲国产成人精品| 欧美乱大交xxxxx| 91久久国产精品91久久性色| 91国内精品久久| 亚洲欧美国产一本综合首页| 色中色综合影院手机版在线观看| 国产精品777| 日韩中文字幕久久| 51色欧美片视频在线观看| 国产精品视频男人的天堂| 日韩精品视频在线观看网址| 国产v综合ⅴ日韩v欧美大片| 色妞一区二区三区| 欧美黄色小视频| 亚洲欧美国产制服动漫| 国产精品高潮呻吟久久av黑人| 国产97在线|日韩| 国产精品国产福利国产秒拍| 亚洲午夜av久久乱码| 亚洲国产精品悠悠久久琪琪| 欧美电影免费在线观看| 欧美激情乱人伦| 午夜精品福利电影| 91深夜福利视频| 777午夜精品福利在线观看| 亚洲人成网站999久久久综合| 欧美成人手机在线| 国产成人激情小视频| 88国产精品欧美一区二区三区| 久久成人综合视频| 欧美理论电影在线观看| 日本国产高清不卡| 青青精品视频播放| 国产精品毛片a∨一区二区三区|国| 日本精品久久久| 亚洲乱码一区二区| 国产免费观看久久黄| 亚洲精品色婷婷福利天堂| 在线播放精品一区二区三区| 性欧美xxxx交| 国产一区二区三区四区福利| 成人羞羞国产免费| 国产精品免费久久久久影院| 亚洲系列中文字幕| 欧美在线观看一区二区三区| 亚洲va久久久噜噜噜久久天堂| 国产精品嫩草视频| 国产一区二区动漫| 欧美成人午夜免费视在线看片| 日韩h在线观看| 精品国产91久久久久久| 日韩电影中文字幕在线观看| 懂色aⅴ精品一区二区三区蜜月| 国产精品福利在线| 久久全球大尺度高清视频| 亚洲欧美日韩国产成人| 欧美高清无遮挡| 亚洲精品在线看| 奇米成人av国产一区二区三区| 欧美插天视频在线播放| 正在播放国产一区| 久久精品91久久久久久再现| 国产精品久久综合av爱欲tv| 日韩欧美亚洲综合| 亲子乱一区二区三区电影| 亚洲日本成人网| 日韩中文字幕精品| 色综合色综合久久综合频道88| 亚洲国产欧美一区| 日韩欧美国产成人| 91超碰caoporn97人人| 日韩一区二区在线视频| 亚洲成人免费网站| 成人免费观看49www在线观看| 热草久综合在线| 国产成人欧美在线观看| 成人妇女免费播放久久久| 97视频免费看| 亚洲欧美一区二区三区四区| 欧美精品久久久久久久久| 欧美色欧美亚洲高清在线视频| 久久中文字幕在线| 日韩性生活视频| 1769国内精品视频在线播放| 91免费综合在线| 欧美多人爱爱视频网站| 777777777亚洲妇女| 在线播放日韩欧美|