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


Posted in PHP onJuly 03, 2019

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

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

1、迷你版Smarty类

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

项目结构图

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

MiniSmarty类代码(MiniSmarty.class.php)

<?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)

<?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)

<!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)文件中,首先是引入模板类文件,实例化模板对象,然后给模板对象赋值,最后显示模板。在模板类(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程序设计有所帮助。

PHP 相关文章推荐
windows xp下安装pear
Dec 02 PHP
Dedecms V3.1 生成HTML速度的优化办法
Mar 18 PHP
PHP 编写大型网站问题集
May 07 PHP
PHP中foreach循环中使用引用要注意的地方
Jan 02 PHP
php脚本运行时的超时机制详解
Feb 17 PHP
PHP小偷程序的设计与实现方法详解
Oct 15 PHP
PHPCMS忘记后台密码的解决办法
Oct 30 PHP
利用PHP访问带有密码的Redis方法示例
Feb 09 PHP
ThinkPHP实现附件上传功能
Apr 27 PHP
php 读取文件夹下所有图片、文件的实例
Oct 17 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
May 29 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
Nov 23 PHP
Referer原理与图片防盗链实现方法详解
Jul 03 #PHP
thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
Jul 03 #PHP
Centos7 Yum安装PHP7.2流程教程详解
Jul 02 #PHP
thinkphp5修改view到根目录实例方法
Jul 02 #PHP
PHP rmdir()函数的用法总结
Jul 02 #PHP
PHP+iframe模拟Ajax上传文件功能示例
Jul 02 #PHP
PHP使用HTML5 FormData对象提交表单操作示例
Jul 02 #PHP
You might like
模板引擎正则表达式调试小技巧
2011/07/20 PHP
PHP explode()函数的几个应用和implode()函数有什么区别
2015/11/05 PHP
深入解析WordPress中加载模板的get_template_part函数
2016/01/11 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
toString()一个会自动调用的方法
2010/02/08 Javascript
Jquery Ajax学习实例 向页面发出请求,返回XML格式数据
2010/03/14 Javascript
解释&amp;&amp;和||在javascript中的另类用法
2014/07/28 Javascript
jquery通过closest选择器修改上级元素的方法
2015/03/17 Javascript
js实现支持手机滑动切换的轮播图片效果实例
2015/04/29 Javascript
在JavaScript的jQuery库中操作AJAX的方法讲解
2015/08/15 Javascript
JavaScript模拟鼠标右键菜单效果
2020/12/08 Javascript
JavaScript中的prototype原型学习指南
2016/05/09 Javascript
快速解决js动态改变dom元素属性后页面及时渲染的问题
2016/07/06 Javascript
利用Angularjs和原生JS分别实现动态效果的输入框
2016/09/01 Javascript
BootStrap表单宽度设置方法
2017/03/10 Javascript
element-ui 表格实现单元格可编辑的示例
2018/02/26 Javascript
vue组件从开发到发布的实现步骤
2018/11/11 Javascript
JavaScript错误处理操作实例详解
2019/01/04 Javascript
详解JSON和JSONP劫持以及解决方法
2019/03/08 Javascript
[52:52]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第三局
2016/02/27 DOTA
python利用装饰器进行运算的实例分析
2015/08/04 Python
Python列表和元组的定义与使用操作示例
2017/07/26 Python
Python:Scrapy框架中Item Pipeline组件使用详解
2017/12/27 Python
python基于ID3思想的决策树
2018/01/03 Python
python利用socketserver实现并发套接字功能
2018/01/26 Python
python使用turtle库与random库绘制雪花
2018/06/22 Python
python使用tkinter库实现五子棋游戏
2019/06/18 Python
app内嵌H5 webview 本地缓存问题的解决
2020/10/19 HTML / CSS
如何利用cmp命令比较文件
2016/04/11 面试题
本科生个人求职自荐信
2013/09/26 职场文书
大学生应聘推荐信范文
2013/11/19 职场文书
个人贷款担保书
2014/04/01 职场文书
小学教师年度个人总结
2015/02/05 职场文书
Pytest allure 命令行参数的使用
2021/04/18 Python
Golang之sync.Pool使用详解
2021/05/06 Golang
ztree+ajax实现文件树下载功能
2021/05/18 Javascript