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 相关文章推荐
Extended CHM PHP 语法手册之 DIY
Oct 09 PHP
火车头采集器3.0采集图文教程
Mar 17 PHP
简单PHP上传图片、删除图片实现代码
May 12 PHP
PHP MemCached 高级缓存应用代码
Aug 05 PHP
php调用MySQL存储过程的方法集合(推荐)
Jul 03 PHP
php遍历文件夹所有文件子文件夹函数代码
Nov 27 PHP
php生成excel文件的简单方法
Feb 08 PHP
织梦sitemap地图实时推送给百度的教程
Aug 03 PHP
PHPExcel笔记, mpdf导出
May 03 PHP
PHP二分查找算法示例【递归与非递归方法】
Sep 29 PHP
PHP文字转图片功能原理与实现方法分析
Aug 31 PHP
php中get_object_vars()在数组的实例用法
Feb 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 文本文章分页代码 按标记或长度(不涉及数据库)
2012/06/07 PHP
PHP-redis中文文档介绍
2013/02/07 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
2013/06/09 PHP
PHP延迟静态绑定示例分享
2014/06/22 PHP
php计算title标题相似比的方法
2015/07/29 PHP
PHP处理二进制数据的实现方法
2016/06/13 PHP
curl 出现错误的调试方法(必看)
2017/02/13 PHP
PHP实现json_decode不转义中文的方法
2017/05/20 PHP
PDO::commit讲解
2019/01/27 PHP
javascript 使用 NodeList需要注意的问题
2013/03/04 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
2013/06/24 Javascript
简单js代码实现selece二级联动(推荐)
2014/02/18 Javascript
js限制文本框的输入内容代码分享(3类)
2015/08/20 Javascript
jQuery中ajax的load()与post()方法实例详解
2016/01/05 Javascript
jquery实现上传文件大小类型的验证例子(推荐)
2016/06/25 Javascript
jQuery中.attr()和.data()的区别分析
2017/09/03 jQuery
初识 Vue.js 中的 *.Vue文件
2017/11/22 Javascript
利用Decorator如何控制Koa路由详解
2018/06/26 Javascript
Element Cascader 级联选择器的使用示例
2020/07/27 Javascript
使用webpack5从0到1搭建一个react项目的实现步骤
2020/12/16 Javascript
python 使用pandas计算累积求和的方法
2019/02/08 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
2019/02/18 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
python3中eval函数用法使用简介
2019/08/02 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
Python 可变类型和不可变类型及引用过程解析
2019/09/27 Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
2020/06/12 Python
python编程的核心知识点总结
2021/02/08 Python
英国川宁茶官方网站:Twinings茶
2019/05/21 全球购物
电脑租赁公司创业计划书
2014/01/08 职场文书
岗位廉洁从业承诺书
2014/03/28 职场文书
师德师风演讲稿
2014/05/05 职场文书
2014年最新版离婚协议书范本
2014/11/25 职场文书
开学随笔
2015/08/15 职场文书
Vue接口封装的完整步骤记录
2021/05/14 Vue.js
Python中的 No Module named ***问题及解决
2022/07/23 Python