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 Mysql日期和时间函数集合
Nov 16 PHP
PHP HTML JavaScript MySQL代码如何互相传值的方法分享
Sep 30 PHP
php中防止恶意刷新页面的代码小结
Oct 31 PHP
ThinkPHP CURD方法之limit方法详解
Jun 18 PHP
php通过array_merge()函数合并两个数组的方法
Mar 18 PHP
php函数重载的替代方法--伪重载详解
May 08 PHP
PHP输出缓冲控制Output Control系列函数详解
Jul 02 PHP
10款实用的PHP开源工具
Oct 23 PHP
使用Huagepage和PGO来提升PHP7的执行性能
Nov 30 PHP
PHP大神的十大优良习惯
Sep 14 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
Apr 10 PHP
PHP实现简单注册登录系统
Dec 28 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
基于Laravel-admin 后台的自定义页面用法详解
2019/09/30 PHP
如何取得中文输入的真实长度?
2006/06/24 Javascript
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
通过JS自动隐藏手机浏览器的地址栏实现原理与代码
2013/01/02 Javascript
三种动态加载js的jquery实例代码另附去除js方法
2014/04/30 Javascript
IE中鼠标经过option触发mouseout的解决方法
2015/01/29 Javascript
jquery实现键盘左右翻页特效
2015/04/30 Javascript
JS实现的新浪微博大厅文字内容滚动效果代码
2015/11/05 Javascript
浅谈angularjs依赖服务注入写法的注意点
2017/04/24 Javascript
vue中component组件的props使用详解
2017/09/04 Javascript
vue组件通信传值操作示例
2019/01/08 Javascript
微信小程序实现的动态设置导航栏标题功能示例
2019/01/31 Javascript
微信小程序登录时如何获取input框中的内容
2019/12/04 Javascript
[07:38]2014DOTA2国际邀请赛 Newbee顺利挺进胜者组赛后专访
2014/07/15 DOTA
[43:26]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第二场 11.20
2020/11/23 DOTA
python实现的二叉树定义与遍历算法实例
2017/06/30 Python
答题辅助python代码实现
2018/01/16 Python
Python浅复制中对象生存周期实例分析
2018/04/02 Python
Flask框架模板继承实现方法分析
2019/07/31 Python
Python二元赋值实用技巧解析
2019/10/25 Python
DataFrame.to_excel多次写入不同Sheet的实例
2019/12/02 Python
Python django框架开发发布会签到系统(web开发)
2020/02/12 Python
如何开发一款堪比APP的微信小程序(腾讯内部团队分享)
2016/12/22 HTML / CSS
Europcar西班牙:全球汽车租赁领域的领导者
2018/09/17 全球购物
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
2015/11/10 面试题
人力资源行政经理自我评价
2013/10/23 职场文书
关于旷工的检讨书
2014/02/02 职场文书
2013年军训通讯稿
2014/02/05 职场文书
公司经理聘任书
2014/03/29 职场文书
消防工作实施方案
2014/06/09 职场文书
未婚证明书模板
2014/10/08 职场文书
2014年行政部工作总结
2014/11/19 职场文书
工作检讨书怎么写
2015/01/23 职场文书
2016教师廉洁教育心得体会
2016/01/13 职场文书
《老人与海鸥》教学反思
2016/02/16 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书