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与XML、XSLT、Mysql的结合运用实现代码
Nov 19 PHP
php输出表格的实现代码(修正版)
Dec 29 PHP
discuz的php防止sql注入函数
Jan 17 PHP
PHP中通过加号合并数组的一个简单方法分享
Jan 27 PHP
php编写一个简单的路由类
Apr 13 PHP
解析php框架codeigniter中如何使用框架的session
Jun 24 PHP
解决php使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)
Jul 03 PHP
php短址转换实现方法
Feb 25 PHP
学习php设计模式 php实现策略模式(strategy)
Dec 07 PHP
Json_encode防止汉字转义成unicode的方法
Feb 25 PHP
Laravel重写用户登录简单示例
Oct 08 PHP
详解Yii2 之 生成 URL 的方法
Jun 16 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
PHP正则提取不包含指定网址的图片地址的例子
2014/04/21 PHP
php通过exif_read_data函数获取图片的exif信息
2015/05/21 PHP
php7 新增功能实例总结
2020/05/25 PHP
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
js获取TreeView控件选中节点的Text和Value值的方法
2012/11/24 Javascript
防止xss和sql注入:JS特殊字符过滤正则
2013/04/18 Javascript
JS localStorage实现本地缓存的方法
2013/06/22 Javascript
bootstrap改变按钮加载状态
2014/12/01 Javascript
Javascript基础教程之for循环
2015/01/18 Javascript
jQuery使用之设置元素样式用法实例
2015/01/19 Javascript
Javascript调用函数方法的几种方式介绍
2015/03/20 Javascript
轻松掌握JavaScript单例模式
2016/08/25 Javascript
javascript self对象使用详解
2016/10/18 Javascript
关于RequireJS的简单介绍即使用方法
2016/10/20 Javascript
vue-cli+webpack在生成的项目中使用bootstrap实例代码
2017/05/26 Javascript
JavaScript实现选中文字提示新浪微博分享效果
2017/06/15 Javascript
微信小程序之分享页面如何返回首页的示例
2018/03/28 Javascript
layui 富文本图片上传接口与普通按钮 文件上传接口的例子
2019/09/23 Javascript
Python制作豆瓣图片的爬虫
2017/12/28 Python
python 字典中文key处理,读取,比较方法
2018/07/06 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
2019/09/16 Python
wxPython色环电阻计算器
2019/11/18 Python
基于Python获取照片的GPS位置信息
2020/01/20 Python
python实现梯度下降算法的实例详解
2020/08/17 Python
详解python内置模块urllib
2020/09/09 Python
Python: glob匹配文件的操作
2020/12/11 Python
python UDF 实现对csv批量md5加密操作
2021/01/01 Python
英国度假别墅预订:Sykes Cottages
2017/06/12 全球购物
俄罗斯运动、健康和美容产品在线商店:Lactomin.ru
2020/07/23 全球购物
"引用"与指针的区别是什么
2016/09/07 面试题
实习评语
2013/12/16 职场文书
给老婆的搞笑检讨书
2014/01/12 职场文书
作文评语大全
2014/04/23 职场文书
企业公益活动策划方案
2014/08/24 职场文书
给朋友的道歉短信
2015/05/12 职场文书
结婚喜宴迎宾词
2015/08/10 职场文书