Smarty模板類內(nèi)部原理實(shí)例分析
本文實(shí)例講述了Smarty模板類內(nèi)部原理。分享給大家供大家參考,具體如下:
之前在學(xué)習(xí)ThinkPHP的時(shí)候,有接觸到Smarty模板類,但是一直不知道其內(nèi)部實(shí)現(xiàn)的原理,博主今天終于知道了其內(nèi)部原理,其實(shí)也挺簡單的,然后寫了一個(gè)迷你版的Smarty模板類,對(duì)理解其內(nèi)部原理有了很大的幫助。
1、迷你版Smarty類
首先上代碼,最后再進(jìn)行講解。
項(xiàng)目結(jié)構(gòu)圖

MiniSmarty類代碼(MiniSmarty.class.php)
<?php
/**
* 迷你模板類
*/
class MiniSmarty{
public $template_dir = '';//模板文件放置的目錄
public $compile_dir = '';//編譯后文件放置的目錄
public $tpl_var = array();//模板賦值的變量
/**
* 給模板進(jìn)行賦值
* @param str $key 鍵
* @param mixed $value 值
* @return void
*/
public function assign($key,$value){
$this->tpl_var[$key] = $value;
}
/**
* 編譯模板,并引入編譯后的文件
* @param str $template 模板文件
* @return void
*/
public function display($template){
$compile_file = $this->compile($template);
include($compile_file);
}
/**
* 將模板文件編譯成php文件
* @param str $template 模板文件名
* @return str 編譯文件名
*/
private function compile($template){
$template_file = $this->template_dir.'/'.$template;
//讀取模板文件中的內(nèi)容
$source = file_get_contents($template_file);
//判斷是否需要再次生產(chǎn)編譯文件
$compile_file = $this->compile_dir.'/'.$template.'.php';
//如果存在編譯文件且編譯文件的修改時(shí)間比模板文件大,則不用再次編譯,直接返回文件路徑
if(file_exists($compile_file) && filemtime($compile_file) > filemtime($template_file)){
return $compile_file;
}
//解析{$}為<?php echo 等操作
$source = str_replace('{$', '<?php echo $this->tpl_var[\'', $source);
$source = str_replace('}', '\'];?>', $source);
//生成編譯文件
file_put_contents($compile_file, $source);
//返回編譯后的文件路徑
return $compile_file;
}
}
?>
測試模板類代碼(testSmarty.php)
<?php
//1、引入并創(chuàng)建模板實(shí)例
include ('./MiniSmarty.class.php');
$Smarty = new MiniSmarty();
$Smarty->template_dir = './template';
$Smarty->compile_dir = './compile';
//2、給模板對(duì)象賦值
$title = '兩會(huì)召開';
$content = '好奶粉,好會(huì)議,好新聞';
$Smarty->assign('title',$title);
$Smarty->assign('content',$content);
//3、顯示模板
$template = 'template.html';
$Smarty->display($template);
?>
模板文件(template.html)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>{$title}</title>
<link rel="stylesheet" href="">
</head>
<body>
<h3>{$content}</h3>
</body>
</html>
編譯后的文件(template.html.php)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title><?php echo $this->tpl_var['title'];?></title> <link rel="stylesheet" href=""> </head> <body> <h3><?php echo $this->tpl_var['content'];?></h3> </body> </html>
代碼都貼完了,最后解釋一下。在測試模板類(testSmarty.php)文件中,首先是引入模板類文件,實(shí)例化模板對(duì)象,然后給模板對(duì)象賦值,最后顯示模板。在模板類(MiniSmarty.class.php)文件中,有3個(gè)屬性和3個(gè)方法,屬性分別是template_dir 、compile_dir‘和tpl_var,含義分別是模板文件的路徑、編譯后文件的路徑、模板對(duì)象的變量。3個(gè)方法分別是assign、display和compile,assign方法是給模板對(duì)象賦值,display方法是編譯模板文件,并引入(顯示)編譯后的文件,compile方法是編譯模板文件。編譯模板文件的過程主要是將模板文件中的{$標(biāo)簽}解析成<?php echo $var?> 等php代碼。
2、Smarty原理分析
工作流程
(1)把需要顯示的全局變量,賦值,塞到對(duì)象的內(nèi)部屬性中的一個(gè)數(shù)組里
(2)然后編譯模板,將{$標(biāo)簽}解析成相應(yīng)的php echo 代碼
(3)引入編譯后的php文件
使用步驟
(1)Smarty是一個(gè)類,要使用的話,必須引入在進(jìn)行實(shí)例化
(2)使用assign給模板賦值
(3)使用display方法【從編譯到輸出】
Smarty的缺點(diǎn)
(1)編譯模板,浪費(fèi)時(shí)間
(2)要把變量再重新賦值到對(duì)象的屬性中,增大了開銷
更多關(guān)于Smarty相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《smarty模板入門基礎(chǔ)教程》、《PHP模板技術(shù)總結(jié)》、《PHP基于pdo操作數(shù)據(jù)庫技巧總結(jié)》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》、《PHP基本語法入門教程》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對(duì)大家基于smarty模板的PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
laravel 使用事件系統(tǒng)統(tǒng)計(jì)瀏覽量的實(shí)現(xiàn)
今天小編就為大家分享一篇laravel 使用事件系統(tǒng)統(tǒng)計(jì)瀏覽量的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-10-10
php中實(shí)現(xiàn)記住密碼下次自動(dòng)登錄的例子
這篇文章主要介紹了php中實(shí)現(xiàn)記住密碼下次自動(dòng)登錄的例子,本文使用cookie實(shí)現(xiàn)記住密碼和自動(dòng)登錄功能,需要的朋友可以參考下2014-11-11
Ajax PHP JavaScript MySQL實(shí)現(xiàn)簡易無刷新在線聊天室
這篇文章主要為大家詳細(xì)介紹了Ajax PHP JavaScript MySQL實(shí)現(xiàn)簡易無刷新在線聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08
php微信公眾平臺(tái)開發(fā)之微信群發(fā)信息
這篇文章主要為大家詳細(xì)介紹了php微信公眾平臺(tái)開發(fā)之微信群發(fā)信息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
ThinkPHP中的關(guān)聯(lián)模型注意點(diǎn)
這篇文章主要介紹了初學(xué)ThinkPHP中的關(guān)聯(lián)模型注意點(diǎn),需要的朋友可以參考下2014-06-06
php定時(shí)執(zhí)行任務(wù)設(shè)置詳解
這篇文章主要介紹了php定時(shí)執(zhí)行任務(wù)設(shè)置的方法,非常簡單,有需要的小伙伴參考下。2015-02-02

