本文实例讲述了Smarty模板类内部原理。分享给大家供大家参考,具体如下:
之前在学习ThinkPHP的时候,有接触到Smarty模板类,但是一直不知道其内部实现的原理,博主今天终于知道了其内部原理,其实也挺简单的,然后写了一个迷你版的Smarty模板类,对理解其内部原理有了很大的帮助。
1、迷你版Smarty类
首先上代码,最后再进行讲解。
项目结构图
MiniSmarty类代码(MiniSmarty.class.php)
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
|
<?php /** * 迷你模板类 */ class MiniSmarty{ public $template_dir = '' ; //模板文件放置的目录 public $compile_dir = '' ; //编译后文件放置的目录 public $tpl_var = array (); //模板赋值的变量 /** * 给模板进行赋值 * @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 ; //读取模板文件中的内容 $source = file_get_contents ( $template_file ); //判断是否需要再次生产编译文件 $compile_file = $this ->compile_dir. '/' . $template . '.php' ; //如果存在编译文件且编译文件的修改时间比模板文件大,则不用再次编译,直接返回文件路径 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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?php //1、引入并创建模板实例 include ( './MiniSmarty.class.php' ); $Smarty = new MiniSmarty(); $Smarty ->template_dir = './template' ; $Smarty ->compile_dir = './compile' ; //2、给模板对象赋值 $title = '两会召开' ; $content = '好奶粉,好会议,好新闻' ; $Smarty ->assign( 'title' , $title ); $Smarty ->assign( 'content' , $content ); //3、显示模板 $template = 'template.html' ; $Smarty ->display( $template ); ?> |
模板文件(template.html)
1
2
3
4
5
6
7
8
9
10
11
12
|
<!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)
1
2
3
4
5
6
7
8
9
10
11
12
|
<!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)文件中,首先是引入模板类文件,实例化模板对象,然后给模板对象赋值,最后显示模板。在模板类(MiniSmarty.class.php)文件中,有3个属性和3个方法,属性分别是template_dir 、compile_dir‘和tpl_var,含义分别是模板文件的路径、编译后文件的路径、模板对象的变量。3个方法分别是assign
、display
和compile
,assign方法是给模板对象赋值,display方法是编译模板文件,并引入(显示)编译后的文件,compile方法是编译模板文件。编译模板文件的过程主要是将模板文件中的{$标签}
解析成<?php echo $var?>
等php代码。
2、Smarty原理分析
工作流程
(1)把需要显示的全局变量,赋值,塞到对象的内部属性中的一个数组里
(2)然后编译模板,将{$标签}解析成相应的php echo 代码
(3)引入编译后的php文件
使用步骤
(1)Smarty是一个类,要使用的话,必须引入在进行实例化
(2)使用assign给模板赋值
(3)使用display方法【从编译到输出】
Smarty的缺点
(1)编译模板,浪费时间
(2)要把变量再重新赋值到对象的属性中,增大了开销
希望本文所述对大家基于smarty模板的PHP程序设计有所帮助。
原文链接:https://blog.csdn.net/baochao95/article/details/52248207