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下使用以下代码连接并测试
Apr 09 PHP
php 防止单引号,双引号在接受页面转义
Jul 10 PHP
解析左右值无限分类的实现算法
Jun 20 PHP
php中生成随机密码的自定义函数代码
Oct 21 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
Apr 24 PHP
php常用的安全过滤函数集锦
Oct 09 PHP
php通过exif_read_data函数获取图片的exif信息
May 21 PHP
php操作MongoDB类实例
Jun 17 PHP
详解Window7 下开发php扩展
Dec 31 PHP
php版微信公众号接口实现发红包的方法
Oct 14 PHP
PHP注释语法规范与命名规范详解篇
Jan 21 PHP
浅谈PHP中的Trait使用方法
Mar 22 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中extract()函数的妙用分析
2012/07/11 PHP
HTML IMG标签 onload 内存溢出导致浏览器CPU占用过高
2021/03/09 Javascript
你所要知道JS(DHTML)中的一些技巧
2007/01/09 Javascript
jQuery(1.3.2) 7行代码搞定跟随屏幕滚动的层
2009/05/21 Javascript
JavaScript中Math对象方法使用概述
2014/01/02 Javascript
自己使用jquery写的一个无缝滚动的插件
2014/04/30 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
2014/08/22 Javascript
20个实用的JavaScript技巧分享
2014/11/28 Javascript
JavaScript版的TwoQueues缓存模型
2014/12/29 Javascript
input输入框鼠标焦点提示信息
2015/03/17 Javascript
在Node.js应用中读写Redis数据库的简单方法
2015/06/30 Javascript
JS实现横向与竖向两个选项卡Tab联动的方法
2015/09/27 Javascript
详解JavaScript的表达式与运算符
2015/11/30 Javascript
jquery ztree异步搜索(搜叶子)实践
2016/02/25 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
2017/01/04 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
2018/06/28 Javascript
vue富文本框(插入文本、图片、视频)的使用及问题小结
2018/08/17 Javascript
jQuery实现基本隐藏与显示效果的方法详解
2018/09/05 jQuery
JS Html转义和反转义(html编码和解码)的实现与使用方法总结
2020/03/10 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
[03:11]DOTA2上海特锦赛小组赛第一日recap精彩回顾
2016/02/28 DOTA
[01:29:31]VP VS VG Supermajor小组赛胜者组第二轮 BO3第一场 6.2
2018/06/03 DOTA
python实现清屏的方法
2015/04/30 Python
django使用html模板减少代码代码解析
2017/12/12 Python
解决python中遇到字典里key值为None的情况,取不出来的问题
2018/10/17 Python
选择Python写网络爬虫的优势和理由
2019/07/07 Python
python定位xpath 节点位置的方法
2019/08/27 Python
基于PyQT实现区分左键双击和单击
2020/05/19 Python
python开发一个解析protobuf文件的简单编译器
2020/11/17 Python
python中HTMLParser模块知识点总结
2021/01/25 Python
小学红领巾中秋节广播稿
2014/01/13 职场文书
学生手册评语
2014/05/05 职场文书
应聘护士求职信
2014/07/21 职场文书
2014年大学班长工作总结
2014/11/14 职场文书
2015年植树节活动总结
2015/02/06 职场文书
小鞋子观后感
2015/06/05 职场文书