PHP--關(guān)于模板的原理和解析,php--模板解析_PHP教程
Jul 12, 2016 am 09:08 AMPHP--關(guān)于模板的原理和解析,php--模板解析
此內(nèi)容用作筆記,以備日后查看,此內(nèi)容為學(xué)習(xí)李炎恢課程而來,并非自己所創(chuàng),如有問題請私信~
將PHP代碼和靜態(tài)HTML代碼進(jìn)行分離,使代碼的可讀性和維護(hù)性得到顯著提高。
使用模板引擎:
? ? 我們所說的模板是Web模板,是主要由HTML標(biāo)記組成的語言來編寫的頁面,但也有如何表示包含動態(tài)生成內(nèi)容的方式(解析標(biāo)簽)。模板引擎是一種軟件庫,允許我們從模板生成HTML代碼,并指定要包含的動態(tài)內(nèi)容。
模板引擎的特點:
1.鼓勵分離:讓更個系統(tǒng)的可讀性和維護(hù)性得到提高。
2.促進(jìn)分工:使得程序員和美工去專心處理自己的設(shè)計。
3.比PHP更容易解析:編譯文件和緩存文件加載更快、占資源更少。
4.增加安全性:可限制模板設(shè)計師進(jìn)行不安全的操作的能力避免誤刪誤訪問等。
模板處理的流程圖
?
創(chuàng)建模板:
1、創(chuàng)建初始模板所需要的文件夾和文件。
a) index.php主文件,用于編寫業(yè)務(wù)邏輯。
b) template.inc.php模板初始化文件,用于初始模版信息。
c) templates目錄存放所有的模板文件。
d) templates_c目錄存放所有編譯文件。
e) cache目錄存放所有緩存文件。
f) includes目錄存放所有的類文件。
g) config目錄存放模板系統(tǒng)變量配置文件。
以下是源碼:
主文件 index.php
<?<span>php //index.php</span>
//設(shè)置編碼為UTF-8
header('Content-Type:text/html;Charset=utf-8');
//網(wǎng)站根目錄
define('ROOT_PATH', dirname(__FILE__));
//存放模板文件夾
define('TPL_DIR', ROOT_PATH.'/templates/');
//編譯文件夾
define('TPL_C_DIR', ROOT_PATH.'/templates_c/');
//緩存文件夾
define('CACHE_DIR', ROOT_PATH.'/cache/');
//定義緩存狀態(tài)
define('IS_CACHE',true);
//設(shè)置緩存狀態(tài)開關(guān)
IS_CACHE ? ob_start() : null;
include ROOT_PATH.'/includes/Templates.class.php';
<span> </span><span>$_name</span> = '方塊李'<span>; </span><span>$array</span> = <span>array</span>(1,2,3,4,5,6<span>); </span><span>$_tpl</span> = <span>new</span><span> Templates(); </span><span>$_tpl</span>->assign('name', <span>$_name</span><span>); </span><span>$_tpl</span>->assign('a', 5>4<span>); </span><span>$_tpl</span>->assign('array', <span>$array</span><span>); </span><span>//</span><span>顯示</span> <span>$_tpl</span>->display('index.tpl'<span>); </span>?>
模板文件 HTML
<!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><!--{webname}--></title> </head> <body> {include "test.php"} <!-- 這是HTML的注釋 --> {#}這是一條PHP的注釋,在HTML頁面里是不顯示的,只會在生成的編譯文件里顯示{#} 我將被index.php導(dǎo)入 {$name}這個標(biāo)簽必須經(jīng)過Parser.class.php這個解析類來解析它1 <br /> 這里的內(nèi)容改變了,為什么? <br /> {if $a} 顯示一號皮膚 {else} 顯示二號皮膚 {/if} <br /> {foreach $array(key,value)} {@key}....{@value} <br /> {/foreach} </body> </html>
模板類:
//Templates.class.php class Templates { //創(chuàng)建一個存放數(shù)組的字段 private $_vars = array(); private $_config = array(); //創(chuàng)建一個構(gòu)造方法 public function __construct(){ if(!is_dir(TPL_DIR) || !is_dir(TPL_C_DIR) || !is_dir(CACHE_DIR) ){ exit('ERROR:模板文件夾或者編譯文件夾或者緩存文件夾沒有創(chuàng)建!'); } //獲取系統(tǒng)變量 $_sxe = simplexml_load_file(ROOT_PATH.'/config/profile.xml'); $_taglib = $_sxe->xpath('/root/taglib'); foreach($_taglib as $_tag){ $this->_config["$_tag->name"] = $_tag->value; } } //創(chuàng)建變量注入方法 /** * assign()變量注入方法 * @param $_var 要注入的變量名,對應(yīng).tpl文件中的需要替換的變量 * @param $_values 要注入的變量值 */ public function assign($_var,$_values){ if(isset($_var) && !empty($_var)){ $this->_vars[$_var] = $_values; }else{ exit('ERROR:請設(shè)置變量名!'); } } //創(chuàng)建一個顯示方法,用來顯示編譯后的文件 public function display($_file){ //設(shè)置模板文件的路徑 $_tplFile = TPL_DIR.$_file; //判斷模板文件是否存在 if(!file_exists($_tplFile)){ exit('ERROR:模板文件不存在'); } //設(shè)置編譯文件名 $_parFile = TPL_C_DIR.md5($_file).$_file.'.php'; //設(shè)置緩存文件名 $_cacheFile = CACHE_DIR.md5($_file).$_file.'.html'; //判斷緩存狀態(tài) if(IS_CACHE){ //判斷緩存文件是否存在 if(file_exists($_cacheFile) && file_exists($_parFile)){ //是否修改過編譯文件或者模板文件 if(filemtime($_cacheFile)>=filemtime($_parFile) && filemtime($_parFile)>filemtime($_tplFile)){ echo '以下是緩存文件內(nèi)容'; echo "<br />"; include $_cacheFile; return; } } } //判斷編譯文件是否存在,模板文件是否修改過 if(!file_exists($_parFile) || (filemtime($_parFile) < filemtime($_tplFile))){ //引入模板解析類 require ROOT_PATH.'/includes/Parser.class.php'; //實例化對象,生成編譯文件 $_parser = new Parser($_tplFile);//模板文件 $_parser->compile($_parFile);//編譯后文件 } //載入編譯文件 include $_parFile; if(IS_CACHE){ //生成緩存文件 file_put_contents($_cacheFile, ob_get_contents()); //清除緩沖區(qū) ob_end_clean(); //載入緩存文件 include $_cacheFile; } } }
解析類:
//Parser.class.php class Parser { //獲取模板內(nèi)容 private $_tpl; //構(gòu)造方法,初始化模板 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,"<?php echo \$this->_vars['$1'] ?>",$this->_tpl); } } //解析IF條件語句 private function parIf(){ //開頭if模式 $_patternIf = '/\{if\s+\$([\w]+)\}/'; //結(jié)尾if模式 $_patternEnd = '/\{\/if\}/'; //else模式 $_patternElse = '/\{else\}/'; //判斷if是否存在 if(preg_match($_patternIf, $this->_tpl)){ //判斷是否有if結(jié)尾 if(preg_match($_patternEnd, $this->_tpl)){ //替換開頭IF $this->_tpl = preg_replace($_patternIf, "<?php if(\$this->_vars['$1']){ ?>", $this->_tpl); //替換結(jié)尾IF $this->_tpl = preg_replace($_patternEnd, "<?php } ?>", $this->_tpl); //判斷是否有else if(preg_match($_patternElse, $this->_tpl)){ //替換else $this->_tpl = preg_replace($_patternElse, "<?php }else{ ?>", $this->_tpl); } }else{ exit('ERROR:語句沒有關(guān)閉!'); } } } //解析foreach private function parForeach(){ $_patternForeach = '/\{foreach\s+\$(\w+)\((\w+),(\w+)\)\}/'; $_patternEndForeach = '/\{\/foreach\}/'; //foreach里的值 $_patternVar = '/\{@(\w+)\}/'; //判斷是否存在 if(preg_match($_patternForeach, $this->_tpl)){ //判斷結(jié)束標(biāo)志 if(preg_match($_patternEndForeach, $this->_tpl)){ //替換開頭 $this->_tpl = preg_replace($_patternForeach, "<?php foreach(\$this->_vars['$1'] as \$$2=>\$$3){?>", $this->_tpl); //替換結(jié)束 $this->_tpl = preg_replace($_patternEndForeach, "<?php } ?>", $this->_tpl); //替換值 $this->_tpl = preg_replace($_patternVar, "<?php echo \$$1?>", $this->_tpl); }else{ exit('ERROR:Foreach語句沒有關(guān)閉'); } } } //解析include private function parInclude(){ $_pattern = '/\{include\s+\"(.*)\"\}/'; if(preg_match($_pattern, $this->_tpl,$_file)){ //判斷頭文件是否存在 if(!file_exists($_file[1]) || empty($_file[1])){ exit('ERROR:包含文件不存在!'); } //替換內(nèi)容 $this->_tpl = preg_replace($_pattern, "<?php include '$1';?>", $this->_tpl); } } //解析系統(tǒng)變量 private function configVar(){ $_pattern = '/<!--\{(\w+)\}-->/'; if(preg_match($_pattern, $this->_tpl,$_file)){ $this->_tpl = preg_replace($_pattern,"<?php echo \$this->_config['$1'] ?>", $this->_tpl); } } //解析單行PHP注釋 private function parCommon(){ $_pattern = '/\{#\}(.*)\{#\}/'; if(preg_match($_pattern, $this->_tpl)){ $this->_tpl = preg_replace($_pattern, "<?php /*($1) */?>", $this->_tpl); } } //生成編譯文件 public function compile($_parFile){ //解析模板變量 $this->parVar(); //解析IF $this->parIf(); //解析注釋 $this->parCommon(); //解析Foreach $this->parForeach(); //解析include $this->parInclude(); //解析系統(tǒng)變量 $this->configVar(); //生成編譯文件 if(!file_put_contents($_parFile, $this->_tpl)){ exit('ERROR:編譯文件生成失敗!'); } } }
總結(jié):模板引擎的整個過程:
1、當(dāng)瀏覽器請求index.php文件時,實例化模板類對像?$_tpl = new Templates();
2、當(dāng)Templates實例化的時候,生成兩個數(shù)組,一個用來存放模板變量,另一個存放系統(tǒng)變量,通過構(gòu)造方法,判斷文件夾是否存在,同時通過XML文件將系統(tǒng)變量數(shù)組初始化
3、通過模板類Templates的注入方法,assign(),將對應(yīng)模板index.tpl中變量的index.php的內(nèi)容注入到模板類的私有變量,完成初始化
4、模板類Templates類顯示方法display() 通過實例化解析類Parser,將取到的注入變量通過解析類進(jìn)行解析(即替換)
5、解析(替換)后,將文件寫入PHP、HTML混全文件
6、通過Templates類的顯示方法將文件輸出:
1、第一次執(zhí)行顯示方法時,將會把PHP、HTML混合文件,生成純靜態(tài)的緩存文件
2、調(diào)用緩存文件,顯示頁面
3、當(dāng)瀏覽器再次調(diào)用顯示方法時,首先根據(jù)各文件的最后修改時間,判斷是否重新生成緩存文件或直接調(diào)用已存在的緩存文件
重點:
1、通過正則表達(dá)式進(jìn)行字符串的替換
2、熟悉OOP
?

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Guide d'utilisation du moteur de modèles ThinkPHP6?: Créer une interface frontale exquise Introduction?: Avec le développement d'applications Web, la conception et le développement d'interfaces frontales sont devenus de plus en plus importants. En tant que développeur, nous devons utiliser un puissant moteur de modèles pour nous aider à créer et gérer des interfaces frontales. Le moteur de modèles de ThinkPHP6 est un outil puissant pour répondre à ce besoin. Cet article explique comment utiliser le moteur de modèles ThinkPHP6 pour créer une belle interface frontale. Partie 1?: Installer le moteur de modèles ThinkPHP6

Ces dernières années, le moteur de modèles dans la programmation PHP est devenu un élément important du développement PHP, permettant aux programmeurs de développer et de gérer plus facilement des pages. Cet article présentera les moteurs de modèles courants dans la programmation PHP. SmartySmarty est un moteur de modèles PHP couramment utilisé. Il prend en charge une série de fonctions telles que des modèles en cache, des modules de plug-in et des fonctions personnalisées. La syntaxe de Smarty est très flexible et peut résoudre le problème de la combinaison de variables PHP avec des balises HTML, rendant le langage PHP plus adapté à la conception basée sur des modèles. De plus, S

Partage d'expérience sur la sélection et l'utilisation du moteur de modèles dans le développement JavaScript Introduction : Dans le développement front-end moderne, le moteur de modèles (TemplateEngine) joue un r?le crucial. Ils permettent aux développeurs d'organiser et de gérer de grandes quantités de données dynamiques de manière plus efficace et de séparer efficacement les données de la présentation de l'interface. Dans le même temps, le choix d'un moteur de modèles approprié peut également apporter aux développeurs une meilleure expérience de développement et une optimisation des performances. Cependant, parmi les nombreux moteurs de modèles JavaScript, lequel choisir ? attraper

Fat-Free Framework est un framework PHP léger con?u pour fournir des outils simples et flexibles pour créer des applications Web. Il contient de nombreuses fonctionnalités utiles telles que le routage, l'accès aux bases de données, la mise en cache, etc. Dans le framework Fat-Free, l'utilisation du moteur de modèles Blade peut nous aider à gérer et à restituer les modèles plus facilement. Blade est le moteur de modèles du framework Laravel, qui offre de puissantes capacités de syntaxe et d'héritage de modèles. Dans cet article, je vais montrer comment utiliser Bl dans le framework Fat-Free

Guide de démarrage du moteur de modèles Golang : Comment utiliser des modèles dans Golang, des exemples de code spécifiques sont requis Introduction : Un moteur de modèles est un outil qui peut combiner des données et des modèles et générer des documents au format HTML, texte ou autres formats. Dans Golang, nous pouvons utiliser le package de modèles intégré (html/template) pour implémenter les fonctions du moteur de modèles. Cet article présentera en détail comment utiliser le moteur de modèles dans Golang et fournira des exemples de code spécifiques. 1. Le concept de base du moteur de modèles est de comprendre comment l'utiliser.

Moteurs de modèles PHP et CGI : Comment parvenir à la réutilisabilité d'un site Web Introduction : Lors du développement de sites Web, nous devons souvent gérer l'affichage de contenu dynamique. Afin d’assurer la maintenabilité et la réutilisabilité du code, l’utilisation d’un moteur de modèles est un choix judicieux. Cet article présentera PHP et CGI, deux moteurs de modèles couramment utilisés, et montrera comment les utiliser pour parvenir à la réutilisabilité d'un site Web à l'aide d'exemples de code. 1. Moteur de modèles PHP PHP est un langage de script serveur largement utilisé, doté de flexibilité et de fonctions puissantes. Le moteur de modèles PHP est un

Avec le développement de la technologie Internet, la demande d’applications Web augmente également. Les développeurs Web utilisent souvent des moteurs de modèles pour générer des pages Web dynamiques. Cet article explorera un nouveau moteur de modèles?: le moteur de modèles du langage Go. Qu'est-ce que le moteur de modèles de langage Go?? Le langage Go est un langage de programmation avancé développé par Google. Sa syntaxe est concise et claire, ce qui la rend facile à apprendre et à utiliser. Le moteur de modèles du langage Go est un système de modèles utilisé pour générer des modèles HTML dans le langage Go. Le moteur de modèles du langage Go est appelé ? bibliothèque standard ?.

En tant que développeur PHP, utiliser un moteur de modèles est un choix naturel. Smarty est un moteur de modèles populaire qui permet de séparer HTML/CSS/JavaScript du code PHP, permettant ainsi aux développeurs de mieux organiser et gérer les projets. Dans cet article, nous apprendrons comment utiliser le moteur de modèles Smarty lors du développement PHP. 1. Installer Smarty Avant, il faut installer Smarty. Dans cet article, nous utiliserons Composer pour installer
