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

首頁 > 語言 > PHP > 正文

PHP框架模板原理分析

2024-09-04 11:43:41
字體:
來源:轉載
供稿:網友

本文主要來聊聊框架理論,但不針對任何一款框架,不過任何一款框架都離不開這個理論,首先我們了解下框架的來龍去脈,任何技術的出現都是為了解決某個問題,之前的博客有講過smarty,其存在就是為了html和php更好地分離開來,而所謂的“框架”是一種為了統一書寫格式,訪問方式而進行的自我約束行為.

其實按照這個說法我們每個人基本上都或多或少的使用過自己定義的框架,比如說在沒使用框架之前自己開發一個項目,有時候是一天無法完成的,我們為了防止混亂,為了更好地記憶我們會進行目錄規劃和程序的規劃,潛意識的把程序分類,放到不同的文件夾,于是框架應運而生了.

又比如說我們曾經做了一個CMS系統,如果我們又接手一個類似的項目,你會重復書寫代碼嗎,答案肯定不會,但如果是別人的項目你拿來改其實是一件很蛋疼的事情的,因為你根本不知道他的這個CMS的規則是什么,即使是自己的項目時間久了如果自己沒有固定的規范的話也是很容易忘記的,那么怎么樣才能保證自己每次寫的代碼都可以按照一定的規范呢,把每個項目要用的東西挑出來,目錄結構挑出來,以后無論什么項目都在這個基礎上書寫,那么屬于自己的框架就出來了.

但框架單純這樣是不完善的,那么框架應該有哪些能力呢,與其這樣說我們不妨想想我們平時一定會寫的代碼一定會做的事情是什么呢,首先解決的是什么呢,為了減少路徑問題,目錄結構的安排其實很重要,有時候文件包含再進行文件的移動總是一件很蛋疼的事情,最好的辦法是什么呢,絕對路徑,但同時存在了一個類似E:www 這樣的問題,但這個值我們可以通過預定義變量$_SERVER["DOCUMENT_ROOT"]獲得,我們可以將其定義為常量,define("ROOT_PATH", $_SERVER["DOCUMENT_ROOT"]);include ROOT_PATH . "/lib/mysql.php";類似這樣的文件夾怎么移動都不會有事的,那么就出現了一個固定的寫法.

為了解決路徑問題而存在的寫法,幾乎每一頁都會用到,還有模板的輸出,數據庫的連接,那么我們可以把這些代碼封裝起來,或者分離出來,每一頁包含即可,被分離的這些部分其實就是一個小框架,為什么這么說呢,如果我們包含它們進來,例如smarty模板,肯定是實例化好的對象,那個量名已經固定,可能是$smarty 如果我們包含了這么個文件進來,這個量就不能再次進行賦值使用,這樣下面部分的代碼就無法進行使用了,由于包含的類,如數據類 上傳類 圖像類 分頁類 位置已經寫死在這個公共文件里,為了不改代碼 這個目錄就成了必須存在的了,目錄格式固定,編寫代碼方式的約束,這就形成了框架. 

多年來的程序員的總結交流及開發經驗,大家總結了一些優秀的編寫方式,最經典的是單點入口,什么是單點入口呢,之前我們總結了一些幾乎每個程序都要用到的功能,這里依然存在一些問題,例如 在公共文件包含之前我們還是不知道根目錄是多少,如果我們在每一個文件夾下面都放一個公共文件存在代碼重復問題,哪天修改的話需要全部修改,需要找到需要多少個這樣的文件,現在是多個程序包含一個程序,然后用戶訪問n個程序來完成各個功能,于是程序員就想可不可以反過來我用一個程序包含這些不同功能的程序,用戶只訪問這個程序就可以了呢.

于是單點入口模式出現了,在網站首頁的 index.php 寫上每個程序都要用的部份 然后跟據某個量,比如一個 get 量來判斷當前實際要執行的程序是哪一個,由 index.php 把它包含進來運行,這種由一個程序,完成所有功能的方式,稱為 單點入口,于是由這個入口程序和它對應的各個目錄結構成為了一個框架.

出于安全在包含文件的時候往往都會固定目錄,不然就容易出漏洞 所以,往往會在路徑頭尾加個限制,例如如下代碼:

include "./app/".$_GET['url'].".php";

那路徑就只能寫成類似這樣index.php?url=news/list,實際包含的是 /app/news/list.php 當然了,實際的情況,還要檢查一下這個程序文件是否存在之類的.

完整一點的話,我們可以這樣寫這個入口文件,代碼如下:

  1. <?php 
  2. //這里寫絕對路徑 
  3. //這里寫數據庫連接 
  4. //這里寫模板初始化,配置 
  5. //這里判斷連接變量 
  6. //這里包含文件進來運行 
  7. //這里輸出模板 
  8. //這里關閉數據庫 
  9. ?> 

 一個面向過程的單點入口框架就完成了,是不是有覺得每次都在地址欄帶一個 get 不方便?那我們可以換一個寫法,例如 tp 框架最喜歡用的 http://localhost/index.php/news/list后面的 /news/list 由程序轉成 php 路徑包含進來就可以了,在 Apache 環境中,這個 /news/list 可以由服務器變量的 PATH_INFO 取得,如果沒有的話。也可以用 REQUEST_URI 取得接近的,IIS 下面,有 HTTP_X_REWRITE_URL 可以取得這個值,自從單點入口模式出現之后,而且oop開發模式從php5開始大行其道,各種oop設計的框架讓我們眼花繚亂,但是萬變不離其宗,依然是什么入口方式,路徑結構是什么樣的,文件名的命名規則,用什么樣的訪問方式,可以運行哪個程序,用oop開發的框架,不外乎就是把主程序改寫成為了一個類.

例如:

  1. //包含共用文件,實例化各個類啥的 
  2. 頁面->初始化(); 
  3. //把用戶發來的網址轉成要包含的路徑 
  4. 頁面->處理網扯(); 
  5. //在這里包含程序運行 
  6. 頁面->運行() 
  7. //輸出模板 
  8. 頁面->輸出() 

各種各樣的框架只是為我們準備了一個規矩罷了,在我們的開發累計的過程中,我們常常會把一些常用的類封裝成類,例如,數據庫類,文件上傳類,圖片處理類,郵件收發類,遠程訪問類,各種接口類……這個時候,我們就會希望框架能給我們提供一個好一點調用類的方法, 也就是所謂的“擴展性”,比如 TP 框架的 Db 類,如果不用其自帶的類庫只用它們的核心框架,其實幾個文件就夠了.

TP 框架支持三種訪問格式:

/news/list

/index.php/news/list

/index.php?m=news&a=list 

第一種需要服務器的 urlrewrite 支持,后面兩種可以直接用,事實上,Zend 框架也差不多文件的包含方式是,以類的形式包含,執行的其實是:/文件夾/對象/方法,這種做法有優勢,因為在同一個功能中,相似的代碼很多,封裝到同一個類里面,可以更高效的重復使用代碼,比如這樣,代碼如下:

  1. class NewsAction { 
  2.     public function head() { 
  3.         在這里處理每一頁頭部 
  4.     } 
  5.     public function index() { 
  6.         $this->head(); 
  7.         在這里處理這一頁 
  8.     } 
  9.     public function show() { 
  10.         $this->head(); 
  11.         在這里處理這一頁 
  12.     } 

還可以利用構造函數等,使每一個功能,在剛進來的時候就都做了同一件事情,以上就是簡單框架的理論.

制作應用原理

index.php 主入口文件,代碼如下:

  1. <?php 
  2.   define('ISEXIST',true); 
  3.   require "init.php"
  4.   $control = new Controller(); 
  5.   $control -> Run(); 
  6. ?> 

init.php 文件,代碼如下:

  1. <?php 
  2.   if(!defined('ISEXIST')) 
  3.    exit("請從入口文件運行程序"); 
  4.   header("Content-Type:text/html;charset=utf-8"); 
  5.   if(!defined('ROOT_PATH')) 
  6.    //這里動態的聲明,''是轉義反斜線,默認''為轉義字符 
  7.    define('ROOT_PATH',str_replace('','/',dirname(__FILE__)));  
  8.   require ROOT_PATH.'/a/config.php'
  9.   require ROOT_PATH.'/a/controller.class.php'
  10.   require ROOT_PATH.'/a/view.class.php'
  11.   require ROOT_PATH.'/a/model.class.php'
  12. ?> 

config.php 文件,代碼如下:

  1. <?php 
  2.   if(!defined('ISEXIST')) 
  3.    exit("請從入口文件運行程序"); 
  4.   $C = array
  5.   'URL_MODE'=>1,//url模式,1為普通模式,2為path_info模式 
  6.   'DEFAULT'=>'welcome',//默認的控制器 
  7.   'DEFAULT_ACTION'=>'index'//默認的方法 
  8.   ); 
  9. ?> 

controller.class.php 文件,代碼如下:

  1. <?php 
  2. class Controller 
  3.  public function Run() 
  4.   { 
  5.   $this->Analysis(); 
  6.   //開始解析URL獲得請求的控制器和方法 
  7.   $control = $_GET['con']; 
  8.   $action = $_GET['act']; 
  9.   $action = ucfirst($action); 
  10.   //這里構造出控制器文件的路徑 
  11.   $controlFile = ROOT_PATH . '/Controllers/' . $control . '.class.php'
  12.   if(!file_exists($controlFile)) //如果文件不存在提示錯誤, 否則引入 
  13.   {  
  14.   exit("{$control}.class.php控制器不存在<br>""請檢查: ".$controlFile."是否存在<br>"); 
  15.   } 
  16.   include($controlFile); 
  17.   $class = ucfirst($control); //將控制器名稱中的每個單詞首字母大寫,來當作控制器的類名 
  18.   if(!class_exists($class)) //判斷類是否存在, 如果不存在提示錯誤 
  19.  { 
  20.  exit("{$control}.class.php中未定義的控制器類" . $class); 
  21.  } 
  22.  $instance = new $class(); //否則創建實例 
  23.  if(!method_exists($instance$action)) //判斷實例$instance中是否存在$action方法, 不存在則提示錯誤 
  24.  { 
  25.  exit("$class類中不存在方法:"$action); 
  26.  } 
  27.  $instance->$action(); 
  28.  } 
  29.  
  30.  
  31.  
  32.  protected function Analysis() 
  33.  { 
  34.  //$GLOBALS['C']['URL_MODE']; 
  35.  global $C//包含全局配置數組, 這個數組是在Config.ph文件中定義的,global聲明$C是調用外部的 
  36.  if($C['URL_MODE'] == 1) 
  37.  //如果URL模式為1 那么就在GET中獲取控制器, 也就是說url地址是這種的 [url=http://localhost/index.php?c]http://localhost /index.php?c[/url]=控制器&a=方法 
  38.  { 
  39.  $control = !emptyempty($_GET['con']) ? trim($_GET['con']) : ''
  40.  $action = !emptyempty($_GET['act']) ? trim($_GET['act']) : ''
  41.  } 
  42.  else if($C['URL_MODE'] == 2) //如果為2 那么就是使用PATH_INFO模式, 也就是url地址是這樣的    [url=http://localhost/index.php/]http://localhost/index.php/[/url]控制器/方法 /其他參數 
  43.  { 
  44.  if(isset($_SERVER['PATH_INFO'])) 
  45.  { 
  46.  //$_SERVER['PATH_INFO']URL地址中文件名后的路徑信息, 不好理解, 來看看例子 
  47.  //比如你現在的URL是 [url=http://www.49028c.com/index.php]http://www.49028c.com/index.php[/url] 那么你的$_SERVER['PATH_INFO']就是空的 
  48.  //但是如果URL是 [url=http://www.49028c.com/index.php/abc/123]http://www.49028c.com/index.php/abc/123[/url] 
  49.  //現在的$_SERVER['PATH_INFO']的值將會是 index.php文件名稱后的內容 /abc/123/ 
  50.  $path = trim($_SERVER['PATH_INFO'], '/'); 
  51.  $paths = explode('/'$path); 
  52.  $control = array_shift($paths); 
  53.  $action = array_shift($paths); 
  54.  } 
  55.  } 
  56.  //這里判斷控制器的值是否為空, 如果是空的使用默認的 
  57.  $_GET['con'] = !emptyempty($control) ? $control : $C['DEFAULT']; 
  58.  //和上面一樣 
  59.  $_GET['act'] = !emptyempty($action) ? $action : $C['DEFAULT_ACTION']; 
  60.  } 
  61. ?> 

welcome.class.php 文件,代碼如下:

  1. <?php 
  2.   class Welcome 
  3.   { 
  4.    function Index() 
  5.    { 
  6.     echo '歡迎使用此CMS系統'
  7.    } 
  8.    function Run() 
  9.    { 
  10.     echo 'Hello'
  11.    } 
  12.     
  13.    function Show() 
  14.    { 
  15.     echo '方法名show'
  16.    } 
  17.   } 
  18. ?> 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
岛国精品视频在线播放| 日韩经典中文字幕在线观看| 日韩欧美成人免费视频| 亚洲无av在线中文字幕| 超碰日本道色综合久久综合| 精品夜色国产国偷在线| 欧美在线一级va免费观看| 国产日韩欧美视频| 91精品国产高清自在线看超| 亚洲娇小xxxx欧美娇小| 日韩a**中文字幕| 精品magnet| 自拍偷拍亚洲区| 在线日韩日本国产亚洲| 蜜臀久久99精品久久久久久宅男| 2019日本中文字幕| 亚洲日本欧美中文幕| 日韩av资源在线播放| 成人黄色在线免费| 亚洲wwwav| 中文字幕一区二区三区电影| 日韩高清av在线| 97热精品视频官网| 欧美高清无遮挡| 欧美成人一二三| 亚洲欧洲国产伦综合| 国产精品高潮呻吟久久av野狼| 日本三级韩国三级久久| 性欧美长视频免费观看不卡| 国产精品免费观看在线| 亚洲精品一区二区久| 日韩精品视频三区| 久久精品中文字幕免费mv| 欧美激情综合色综合啪啪五月| 亚洲国产日韩欧美综合久久| 91香蕉电影院| 亚洲欧洲偷拍精品| 尤物精品国产第一福利三区| 精品久久久久久久久久ntr影视| 欧美重口另类videos人妖| 国产精品日韩专区| 色婷婷久久一区二区| 欧美裸体xxxxx| 亚洲精品成人网| 国产一区二区三区网站| 日韩欧美成人精品| 国产玖玖精品视频| 日本精品在线视频| 第一福利永久视频精品| 亚洲男人天堂2019| 国产成人精品久久二区二区91| 亚洲黄页网在线观看| 久久国产精品网站| 欧美国产日韩中文字幕在线| 久久亚洲国产精品| 日韩精品视频免费专区在线播放| www.日韩视频| 国产成人精品一区| 色综合久久中文字幕综合网小说| 国内精品美女av在线播放| 精品日本美女福利在线观看| 欧美国产亚洲视频| 国产日韩在线免费| 7m第一福利500精品视频| 亚洲国产精品大全| 国语自产精品视频在线看一大j8| 国产成人午夜视频网址| 91中文在线视频| 久久亚洲国产精品成人av秋霞| 国产精品午夜国产小视频| 欧美日韩色婷婷| 亚洲成人网在线观看| 成年人精品视频| 永久免费毛片在线播放不卡| 性欧美xxxx交| 国产欧美一区二区三区久久人妖| 日韩美女在线播放| 亚洲一区二区三区777| 久久精品最新地址| 亚洲а∨天堂久久精品9966| 亚洲精品综合久久中文字幕| 精品色蜜蜜精品视频在线观看| 久久久久久久久久久网站| 国产一区二区三区丝袜| 久久久久久久香蕉网| 亚洲欧美日韩直播| 欧美日韩午夜激情| 亚洲国产天堂久久国产91| 久久久久久一区二区三区| 亚洲肉体裸体xxxx137| 国产精品自拍视频| 自拍亚洲一区欧美另类| www.亚洲男人天堂| 欧美裸体男粗大视频在线观看| 亚洲激情在线观看视频免费| 久久久久久久91| 日韩免费看的电影电视剧大全| 55夜色66夜色国产精品视频| 91精品久久久久久久久久另类| 欧美电影免费在线观看| 亚洲人成电影网| 91久久在线播放| 久久久国产精品视频| 九九热精品视频在线播放| 亚洲精品一区二区三区不| 国产精品大陆在线观看| 欧美怡红院视频一区二区三区| 国产亚洲一区二区精品| 中文字幕亚洲欧美在线| 国产精品白丝av嫩草影院| 欧美大片免费看| 欧美电影电视剧在线观看| 欧美自拍视频在线观看| 国产一区二区精品丝袜| 日韩在线欧美在线国产在线| …久久精品99久久香蕉国产| 欧美大片大片在线播放| 国产精欧美一区二区三区| 精品中文字幕视频| 亚洲欧美国产一区二区三区| 国产91在线高潮白浆在线观看| 亚洲男人av在线| 欧美黑人xxxx| 国产精品日韩专区| 91九色单男在线观看| 亚洲大胆美女视频| 欧美一级黑人aaaaaaa做受| 欧美国产欧美亚洲国产日韩mv天天看完整| 91九色精品视频| 国产mv久久久| 欧美一级淫片videoshd| 亚洲精品一区久久久久久| 国产精品国语对白| 5278欧美一区二区三区| 久久久成人的性感天堂| 日韩欧美中文在线| 久久精品国产69国产精品亚洲| 久久手机精品视频| 欧美一区二区三区艳史| 国产精品久久久久久av福利| 少妇高潮久久77777| 51精品在线观看| 国产精品夫妻激情| 国产精品爽爽爽爽爽爽在线观看| 欧美另类xxx| 日韩成人在线电影网| 国产欧洲精品视频| 亚洲色图五月天| 97成人精品视频在线观看| 亚洲精品国产精品久久清纯直播| 国产精品三级美女白浆呻吟| 国产精品成av人在线视午夜片| 欧美黄网免费在线观看| 日韩欧美国产激情| 亚洲国产美女久久久久| 精品精品国产国产自在线| 亚洲国产日韩一区| 亚洲高清免费观看高清完整版| 欧美成人精品xxx| 亚洲国产精品成人一区二区| 国产成人a亚洲精品| 亚洲欧美国产一本综合首页| 欧美大片在线看| 久久91亚洲精品中文字幕|