最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP仿tp實(shí)現(xiàn)mvc框架基本設(shè)計(jì)思路與實(shí)現(xiàn)方法分析

 更新時(shí)間:2018年05月23日 10:48:18   作者:水月情緣雪飛飛  
這篇文章主要介紹了PHP仿tp實(shí)現(xiàn)mvc框架基本設(shè)計(jì)思路與實(shí)現(xiàn)方法,簡單講述了php實(shí)現(xiàn)tp框架的原理,并結(jié)合實(shí)例形式分析了相關(guān)控制器、視圖及URL訪問操作技巧與注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了PHP仿tp實(shí)現(xiàn)mvc框架基本設(shè)計(jì)思路與實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:

仿tp mvc基本設(shè)計(jì)與簡單實(shí)現(xiàn)

一:文件加載常識(shí)

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

<?php
class A{
  public $a = 10;
  public function aa(){  // 不能使用一個(gè)a是因?yàn)?,new A 之后 方法a會(huì)被自動(dòng)執(zhí)行,所以方法名不可以和類名沖突。
    echo $this->a; // 輸出屬性.
  }
  public function __construct(){ // 構(gòu)造方法,實(shí)例化后自動(dòng)執(zhí)行,
    echo $this->bb(); // 調(diào)用方法。
  }
  public function bb(){
    echo "我是bb";
  }
}
$a = new A;
$a->aa();
class B extends A{ // 繼承 A ,類A是類B的父級(jí)。繼承public的,
}
$b = new B;
$b->aa(); // 可以輸出類A里面的屬性。

工廠模式參閱:http://www.fzitv.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']; 轉(zhuǎn)換得到類名或者方法名(下面講解)。
    $this->class = ucfirst(strtolower($class)).'Controller'; //對(duì)類名進(jìn)行安全處理,并加上控制器后綴
    $this->method = strtolower($method);   //對(duì)方法名進(jìn)行安全處理
    $this->work($this->class,$this->method);
  }
  public function work($class,$method){
    // 把文件命名成 (類名.class.php的形式),就可以通過類名找到文件。
    //include '文件名(文件在別的地方)';    #例如 include './index.php'; 引入文件然后實(shí)例化類。
    $c = new $class;  //實(shí)例化類
    $c->$method();  //訪問類的方法
  }
}

至此我們可以通過url的 $_GET 參數(shù)來解決

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

h為前后臺(tái),v為控制器,c為模板。

$v = $_GET['v'];
$c = rtrim($_GET['c'],".html");
new A($v,$c); // 根據(jù)繼承關(guān)系再次加載文件。
// extract($arr);  //extract 的作用:從數(shù)組中將變量導(dǎo)入到當(dāng)前的符號(hào)表,鍵做變量,值做值!
// compact(); // — 建立一個(gè)數(shù)組,包括變量名和它們的值
// assign display 實(shí)現(xiàn)參閱:http://www.fzitv.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 = ''){ // 模板為空自動(dòng)加載。
    $this->assign($this->key,$this->val);
    extract($this->array);
    // 如果模板為空就在這里根據(jù)get參數(shù)添加或者通過 $_SERVER['PATH_INFO']; 轉(zhuǎn)換得到。(下面講解)
    if(file_exists($tpl)){ //模板存在就加載文件。
      include $tpl;
    }
  }
}
//繼承總model。這個(gè)model名字和控制器model的名字是一樣的。繼承方法同Controller,總model必須需要加上一個(gè)return。數(shù)據(jù)處理的indexmodel可以加return,也可以不加。
class IndexModel extends Model{
  public function index(){
    // 數(shù)據(jù)處理。
    // 需要返回?cái)?shù)據(jù)就加上return。
  }
}
class IndexController extends Controller{ // 繼承
  public function index(){
    $m = Model("index");
    echo '實(shí)例化后的index方法<br>';
    $this->assign('m',$m); // 分配數(shù)據(jù)。
    $this->display('index.html'); // 模板
  }
}

mvc雖然實(shí)現(xiàn)但是不夠人性化,因?yàn)槊看味家由蟝et參數(shù),變得很冗長,解決的關(guān)鍵在于$_SERVER['PATH_INFO'];

用這個(gè)替換掉h m v三個(gè)參數(shù)。

1. 當(dāng)輸入url為:http://mvc.com/index.php/home/index/index.html
    這種情況下  index.php 斜線后面的apache會(huì)自動(dòng)認(rèn)為是一個(gè)路徑。
    $_SERVER['PATH_INFO'] =  /home/index/index.html
    第1個(gè)斜線 /home        前后臺(tái)
    第2個(gè)斜線 /index        控制器
    第3個(gè)斜線 /index.html  模板文件
    如果后面加有參數(shù)例如:?a=18&b=38   他不會(huì)被加到$_SERVER['PATH_INFO']里面。$_POST 或者 $_GET 也不會(huì)加入$_SERVER['PATH_INFO']里面的內(nèi)容,這樣就可以讓控制參數(shù)和數(shù)據(jù)的參數(shù)互不沖突。

2. U 方法的實(shí)現(xiàn)。重新改寫$_SERVER['PATH_INFO'] 參數(shù),改變?yōu)橐粋€(gè)數(shù)據(jù)。array( 'home', 'Index', 'index');

每次進(jìn)入入口文件index.php都把他的PHP_INFO參數(shù)轉(zhuǎn)換為數(shù)組,在控制器或者其他的地方只要調(diào)用這個(gè)參數(shù)就行了。

// 這里如果做了大小寫的轉(zhuǎn)換,總控制器里面就不用了。
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方法做控制器或前后臺(tái)的跳轉(zhuǎn)。第三個(gè)參數(shù)是輸出還是return。默認(rèn)是直接輸出。
function U($string = '',$method = '',$bool = true){ // true 是直接輸出或者返回,
  // 獲取系統(tǒng)變量。
  $path_info = $_SERVER['PATH_INFO'];
  $script_name = $_SERVER['SCRIPT_NAME'];
  // 判斷中間有沒有 / 以確定參數(shù)個(gè)數(shù)。
  if(strpos($string,'/')){
    $arr = explode('/',$string);
    if(count($arr) == 2){  // 兩個(gè)參數(shù)的情況。
      $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){ // 三個(gè)參數(shù)的情況。
      $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); // 一個(gè)參數(shù)的情況。
    $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

內(nèi)容:

<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  重寫狀態(tài)ok。

發(fā)現(xiàn) $_SERVER['REDIRECT_URL'];$_SERVER['PATH_INFO']; 參數(shù)相同。所以參數(shù)后面就可以去掉index.php這安全的問題。

4. 模板替換(思路)

我們會(huì)發(fā)現(xiàn)有一個(gè)我們書寫的模板,里面有 {$arr}  <include file="" /> 等,我們把模板文件讀取后通過正則還有字符串把他轉(zhuǎn)換成正常的php文件。對(duì)文件名加密后放到替換后的文件夾下,每次url訪問的時(shí)候查看是否有緩存文件,判斷最后修改時(shí)間等驗(yàn)證,

5. 數(shù)據(jù)緩存(思路)

json_encode() json_decode() file_get_contents() file_put_contents(); unserialize();  serialize(); 等存文文件里面或者memcache redis 等存儲(chǔ)。

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • PHP導(dǎo)入導(dǎo)出Excel代碼

    PHP導(dǎo)入導(dǎo)出Excel代碼

    本文給大家分享的是PHP將Excel導(dǎo)入數(shù)據(jù)庫以及數(shù)據(jù)庫數(shù)據(jù)導(dǎo)出至Excel的方法和示例,有需要的小伙伴可以參考下
    2015-07-07
  • php小技巧之過濾ascii控制字符

    php小技巧之過濾ascii控制字符

    分享一個(gè)小技巧,在PHP中如何過濾ascii控制字符,需要的朋友可以參考下
    2014-05-05
  • php define的第二個(gè)參數(shù)使用方法

    php define的第二個(gè)參數(shù)使用方法

    今天閱讀php源碼,發(fā)現(xiàn)define的第二個(gè)參數(shù)其實(shí)也可以是一個(gè)對(duì)象,我們來看看如何使用。
    2013-11-11
  • PHP簡單實(shí)現(xiàn)循環(huán)鏈表功能示例

    PHP簡單實(shí)現(xiàn)循環(huán)鏈表功能示例

    這篇文章主要介紹了PHP簡單實(shí)現(xiàn)循環(huán)鏈表功能,簡單描述了循環(huán)鏈表的概念、功能并結(jié)合實(shí)例形式分析了php定義及使用循環(huán)鏈表的相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • CKEditor4結(jié)合php實(shí)現(xiàn)上傳圖片功能

    CKEditor4結(jié)合php實(shí)現(xiàn)上傳圖片功能

    ckedit4是沒有圖片上傳功能的,單我們可以通過配置?config.js?文件來設(shè)置圖片上傳的接口,然后結(jié)合后端程序?qū)崿F(xiàn)圖片上傳,本文講解CKEditor4結(jié)合php實(shí)現(xiàn)上傳圖片功能的方法
    2024-03-03
  • ubuntu 編譯安裝php 5.3.3+memcache的方法

    ubuntu 編譯安裝php 5.3.3+memcache的方法

    ubuntu 編譯安裝php 5.3.3+memcache的方法,需要的朋友可以參考下。
    2010-08-08
  • 如何使用php輸出時(shí)間格式

    如何使用php輸出時(shí)間格式

    PHP默認(rèn)的時(shí)區(qū)UTC時(shí)區(qū),而北京正好位于該時(shí)區(qū)的東八區(qū),領(lǐng)先UTC時(shí)區(qū)8個(gè)小時(shí),所以在PHP中使用time()函數(shù)獲取的當(dāng)前時(shí)間總是相差8個(gè)小時(shí)
    2013-08-08
  • PHP實(shí)現(xiàn)下載功能的代碼

    PHP實(shí)現(xiàn)下載功能的代碼

    PHP實(shí)現(xiàn)下載功能的代碼,并實(shí)現(xiàn)安全下載,隱藏文件真實(shí)地址等,需要的朋友可以參考下
    2012-09-09
  • php htmlentities和htmlspecialchars 的區(qū)別

    php htmlentities和htmlspecialchars 的區(qū)別

    很多人都以為htmlentities跟htmlspecialchars的功能是一樣的,都是格式化html代碼的,我以前也曾這么認(rèn)為,但是今天我發(fā)現(xiàn)并不是這樣的。
    2008-08-08
  • linux下使用ThinkPHP需要注意大小寫導(dǎo)致的問題

    linux下使用ThinkPHP需要注意大小寫導(dǎo)致的問題

    今天把剛完成的第一部分功能部署到客戶的測試服務(wù)器上,結(jié)果傻眼了,好多功能都用不了,列表頁刷出來全是空的。
    2011-08-08

最新評(píng)論

西乡县| 高邮市| 平山县| 渝中区| 繁昌县| 行唐县| 兴山县| 唐河县| 台安县| 忻州市| 隆林| 谢通门县| 朔州市| 深水埗区| 台东市| 加查县| 静安区| 湘乡市| 黑山县| 沁阳市| 水富县| 长宁区| 尚义县| 新巴尔虎右旗| 连平县| 五大连池市| 丰台区| 榆中县| 宁河县| 丽水市| 邓州市| 德庆县| 梁平县| 江北区| 定南县| 娄底市| 亳州市| 开封县| 玉环县| 西吉县| 苍梧县|