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 相关文章推荐
在同一窗体中使用PHP来处理多个提交任务
Oct 09 PHP
PHP的MVC模式实现原理分析(一相简单的MVC框架范例)
Apr 29 PHP
ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法
Nov 04 PHP
PHP使用xmllint命令处理xml与html的方法
Dec 15 PHP
PHP中使用xmlreader读取xml数据示例
Dec 29 PHP
php使用socket post数据到其它web服务器的方法
Jun 02 PHP
php轻量级的性能分析工具xhprof的安装使用
Aug 12 PHP
PHP实现连接设备、通讯和发送命令的方法
Oct 13 PHP
基于PHP实现通过照片获取ip地址
Apr 26 PHP
PHP+mysql实现从数据库获取下拉树功能示例
Jan 06 PHP
phpfpm的作用和用法
Oct 10 PHP
layui数据表格自定义每页条数limit设置
Oct 26 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
PHP5函数小全(分享)
2013/06/06 PHP
PHP中使用memcache存储session的三种配置方法
2014/04/05 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
2014/09/22 PHP
php如何修改SESSION的生存存储时间的实例代码
2017/07/05 PHP
PHP 文件锁与进程锁的使用示例
2017/08/07 PHP
Packer 3.0 JS压缩及混淆工具 下载
2007/05/03 Javascript
js中判断数字\字母\中文的正则表达式 (实例)
2012/06/29 Javascript
Javascript 中 null、NaN和undefined的区别总结
2013/04/10 Javascript
jQuery Real Person验证码插件防止表单自动提交
2015/11/06 Javascript
JavaScript String 对象常用方法详解
2016/05/13 Javascript
Angular2学习笔记——详解NgModule模块
2016/12/02 Javascript
完美解决UI-Grid表格元素中多个空格显示为一个空格的问题
2017/04/25 Javascript
jquery实现左右轮播切换效果
2018/01/01 jQuery
Vue项目中设置背景图片方法
2018/02/21 Javascript
详解Webpack + ES6 最新环境搭建与配置
2018/06/04 Javascript
基于webpack4.X从零搭建React脚手架的方法步骤
2018/12/23 Javascript
JavaScript JSON数据处理全集(小结)
2019/08/15 Javascript
jQuery实现消息弹出框效果
2019/12/10 jQuery
vue离开当前页面触发的函数代码
2020/09/01 Javascript
[01:10]DOTA2次级职业联赛 - U5战队宣传片
2014/12/01 DOTA
[01:11:11]Alliance vs RNG 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Python封装shell命令实例分析
2015/05/05 Python
使用Python操作excel文件的实例代码
2017/10/15 Python
scrapy spider的几种爬取方式实例代码
2018/01/25 Python
python实现快速排序的示例(二分法思想)
2018/03/12 Python
pandas.DataFrame 根据条件新建列并赋值的方法
2018/04/08 Python
Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)
2020/01/03 Python
python 爬取古诗文存入mysql数据库的方法
2020/01/08 Python
tensorflow-gpu安装的常见问题及解决方案
2020/01/20 Python
Python爬虫爬取博客实现可视化过程解析
2020/06/29 Python
python 数据类型强制转换的总结
2021/01/25 Python
Python的Tqdm模块实现进度条配置
2021/02/24 Python
可自定义箭头样式的CSS3气泡提示框
2016/03/16 HTML / CSS
行政内勤岗位职责
2014/04/07 职场文书
营销计划书范文
2015/01/17 职场文书
Nginx反向代理至go-fastdfs案例讲解
2021/08/02 Servers