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生成文件
Jan 15 PHP
PHP开发过程中常用函数收藏
Dec 14 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
Jun 25 PHP
windows7下安装php的php-ssh2扩展教程
Jul 04 PHP
PHP中使用file_get_contents post数据代码例子
Feb 13 PHP
php中关于长度计算容易混淆的问题分析
May 27 PHP
thinkPHP交易详情查询功能详解
Dec 02 PHP
PHP+mysql实现从数据库获取下拉树功能示例
Jan 06 PHP
laravel学习笔记之模型事件的几种用法示例
Aug 15 PHP
laravel 框架配置404等异常页面
Jan 07 PHP
php实现获取近几日、月时间示例
Jul 06 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
May 02 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模板引擎Smarty内建函数详解
2016/04/11 PHP
redis+php实现微博(一)注册与登录功能详解
2019/09/23 PHP
基于ThinkPHP删除目录及目录文件函数
2020/10/28 PHP
ajax的hide隐藏问题解决方法
2012/12/11 Javascript
把input初始值不写value的具体实现方法
2013/07/04 Javascript
IE8 内存泄露(内存一直增长 )的原因及解决办法
2016/04/06 Javascript
javascript模块化简单解析
2016/04/07 Javascript
JS针对Array的各种操作汇总
2016/11/29 Javascript
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
微信小程序使用npm支持踩坑
2018/11/07 Javascript
Vuex modules模式下mapState/mapMutations的操作实例
2019/10/17 Javascript
Javascript查看大图功能代码实现
2020/05/07 Javascript
用JavaScript实现贪吃蛇游戏
2020/10/23 Javascript
vue-cli3配置favicon.ico和title的流程
2020/10/27 Javascript
vue内置组件keep-alive事件动态缓存实例
2020/10/30 Javascript
nuxt静态部署打包相对路径操作
2020/11/06 Javascript
如何用itertools解决无序排列组合的问题
2017/05/18 Python
Python爬虫实战:分析《战狼2》豆瓣影评
2018/03/26 Python
浅谈numpy数组中冒号和负号的含义
2018/04/18 Python
python对视频画框标记后保存的方法
2018/12/07 Python
Django ModelForm组件使用方法详解
2019/07/23 Python
python实现简单银行管理系统
2019/10/25 Python
Python遍历字典方式就实例详解
2019/12/28 Python
tensorflow 分类损失函数使用小记
2020/02/18 Python
Keras官方中文文档:性能评估Metrices详解
2020/06/15 Python
viagogo意大利票务平台:演唱会、体育比赛、戏剧门票
2018/01/26 全球购物
西班牙Polo衫品牌:Polo Club
2020/08/09 全球购物
怎样声明接口
2014/09/19 面试题
Python是如何进行类型转换的
2013/06/09 面试题
宿舍卫生检讨书
2014/01/16 职场文书
大学生职业规划书的范本
2014/02/18 职场文书
乡镇务虚会发言材料
2014/10/20 职场文书
客服专员岗位职责
2015/02/10 职场文书
汽车4S店前台接待岗位职责
2015/04/03 职场文书
python - asyncio异步编程
2021/04/06 Python
python高温预警数据获取实例
2022/07/23 Python