程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP-關於模板的原理和解析

PHP-關於模板的原理和解析

編輯:關於PHP編程

PHP-關於模板的原理和解析


此內容用作筆記,以備日後查看,此內容為學習李炎恢課程而來,並非自己所創,如有問題請私信~

將PHP代碼和靜態HTML代碼進行分離,使代碼的可讀性和維護性得到顯著提高。

使用模板引擎:

    我們所說的模板是Web模板,是主要由HTML標記組成的語言來編寫的頁面,但也有如何表示包含動態生成內容的方式(解析標簽)。模板引擎是一種軟件庫,允許我們從模板生成HTML代碼,並指定要包含的動態內容。

  模板引擎的特點:

  1.鼓勵分離:讓更個系統的可讀性和維護性得到提高。
  2.促進分工:使得程序員和美工去專心處理自己的設計。
  3.比PHP更容易解析:編譯文件和緩存文件加載更快、占資源更少。
  4.增加安全性:可限制模板設計師進行不安全的操作的能力避免誤刪誤訪問等。

模板處理的流程圖

  \

 

創建模板:

  1、創建初始模板所需要的文件夾和文件。

  a) index.php主文件,用於編寫業務邏輯。
  b) template.inc.php模板初始化文件,用於初始模版信息。
  c) templates目錄存放所有的模板文件。
  d) templates_c目錄存放所有編譯文件。
  e) cache目錄存放所有緩存文件。
  f) includes目錄存放所有的類文件。
  g) config目錄存放模板系統變量配置文件。

  \

  以下是源碼:

主文件 index.php  

DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
	<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>title>
	 
	head>
	<body>
	{include "test.php"}
	
	{#}這是一條PHP的注釋,在HTML頁面裡是不顯示的,只會在生成的編譯文件裡顯示{#}
	我將被index.php導入
	{$name}這個標簽必須經過Parser.class.php這個解析類來解析它1
	<br />
	這裡的內容改變了,為什麼?
	<br />
	{if $a}
	顯示一號皮膚
	{else}
	顯示二號皮膚
	{/if}
	<br />
	{foreach $array(key,value)}
	{@key}....{@value} <br />
	{/foreach}
	body>
	html>
	
	
	





  

模板類:

+ View Code

解析類:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 //Parser.class.php     class Parser {         //獲取模板內容         private $_tpl;         //構造方法,初始化模板         public function __construct($_tplFile){             //判斷文件是否存在             if(!$this->_tpl = file_get_contents($_tplFile)){                 exit('ERROR:讀取模板出錯!');             }                      }                  //解析普通變量         private function parVar(){             $_pattern '/\{\$([\w]+)\}/';             if (preg_match($_pattern,$this->_tpl)) {                 $this->_tpl = preg_replace($_pattern,"_vars['$1'] ?>",$this->_tpl);             }         }         //解析IF條件語句         private function parIf(){             //開頭if模式             $_patternIf '/\{if\s+\$([\w]+)\}/';             //結尾if模式             $_patternEnd '/\{\/if\}/';             //else模式             $_patternElse '/\{else\}/';             //判斷if是否存在             if(preg_match($_patternIf$this->_tpl)){                 //判斷是否有if結尾                 if(preg_match($_patternEnd$this->_tpl)){                     //替換開頭IF                     $this->_tpl = preg_replace($_patternIf"_vars['$1']){ ?>"$this->_tpl);                     //替換結尾IF                     $this->_tpl = preg_replace($_patternEnd""$this->_tpl);                     //判斷是否有else                     if(preg_match($_patternElse$this->_tpl)){                         //替換else                         $this->_tpl = preg_replace($_patternElse""$this->_tpl);                     }                 }else{                     exit('ERROR:語句沒有關閉!');                 }             }         }         //解析foreach         private function parForeach(){             $_patternForeach '/\{foreach\s+\$(\w+)\((\w+),(\w+)\)\}/';             $_patternEndForeach '/\{\/foreach\}/';             //foreach裡的值             $_patternVar '/\{@(\w+)\}/';             //判斷是否存在             if(preg_match($_patternForeach$this->_tpl)){                 //判斷結束標志                 if(preg_match($_patternEndForeach$this->_tpl)){                     //替換開頭                     $this->_tpl = preg_replace($_patternForeach"_vars['$1'] as \$$2=>\$$3){?>"$this->_tpl);                     //替換結束                     $this->_tpl = preg_replace($_patternEndForeach""$this->_tpl);                     //替換值                     $this->_tpl = preg_replace($_patternVar""$this->_tpl);                 }else{                     exit('ERROR:Foreach語句沒有關閉');                 }             }         }         //解析include         private function parInclude(){             $_pattern '/\{include\s+\"(.*)\"\}/';             if(preg_match($_pattern$this->_tpl,$_file)){                 //判斷頭文件是否存在                 if(!file_exists($_file[1]) || empty($_file[1])){                     exit('ERROR:包含文件不存在!');                 }                 //替換內容                 $this->_tpl = preg_replace($_pattern""$this->_tpl);             }         }         //解析系統變量         private function configVar(){             $_pattern '//';             if(preg_match($_pattern$this->_tpl,$_file)){                 $this->_tpl = preg_replace($_pattern,"_config['$1'] ?>"$this->_tpl);                              }         }                  //解析單行PHP注釋         private function parCommon(){             $_pattern '/\{#\}(.*)\{#\}/';             if(preg_match($_pattern$this->_tpl)){                 $this->_tpl = preg_replace($_pattern""$this->_tpl);             }         }                           //生成編譯文件         public function compile($_parFile){             //解析模板變量             $this->parVar();             //解析IF             $this->parIf();             //解析注釋             $this->parCommon();             //解析Foreach             $this->parForeach();             //解析include             $this->parInclude();             //解析系統變量             $this->configVar();             //生成編譯文件             if(!file_put_contents($_parFile$this->_tpl)){                 exit('ERROR:編譯文件生成失敗!');             }         }     }

  

總結:模板引擎的整個過程:

  1、當浏覽器請求index.php文件時,實例化模板類對像 $_tpl = new Templates();

  2、當Templates實例化的時候,生成兩個數組,一個用來存放模板變量,另一個存放系統變量,通過構造方法,判斷文件夾是否存在,同時通過XML文件將系統變量數組初始化

  3、通過模板類Templates的注入方法,assign(),將對應模板index.tpl中變量的index.php的內容注入到模板類的私有變量,完成初始化

  4、模板類Templates類顯示方法display() 通過實例化解析類Parser,將取到的注入變量通過解析類進行解析(即替換)

  5、解析(替換)後,將文件寫入PHP、HTML混全文件

  6、通過Templates類的顯示方法將文件輸出:

     1、第一次執行顯示方法時,將會把PHP、HTML混合文件,生成純靜態的緩存文件

     2、調用緩存文件,顯示頁面

     3、當浏覽器再次調用顯示方法時,首先根據各文件的最後修改時間,判斷是否重新生成緩存文件或直接調用已存在的緩存文件

重點:

  1、通過正則表達式進行字符串的替換

  2、熟悉OOP


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved