Smarty模板类内部原理实例分析

2025-05-29 0 69

本文实例讲述了Smarty模板类内部原理。分享给大家供大家参考,具体如下:

之前在学习ThinkPHP的时候,有接触到Smarty模板类,但是一直不知道其内部实现的原理,博主今天终于知道了其内部原理,其实也挺简单的,然后写了一个迷你版的Smarty模板类,对理解其内部原理有了很大的帮助。

1、迷你版Smarty

首先上代码,最后再进行讲解。

项目结构图

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_dircompile_dir‘和tpl_var,含义分别是模板文件的路径、编译后文件的路径、模板对象的变量。3个方法分别是assigndisplaycompile,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

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Smarty模板类内部原理实例分析 https://www.kuaiidc.com/91984.html

相关文章

发表评论
暂无评论