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 相关文章推荐
从Web查询数据库之PHP与MySQL篇
Sep 25 PHP
php生成xml简单实例代码
Dec 16 PHP
PHP 加密解密内部算法
Apr 22 PHP
深入解析php之sphinx
May 15 PHP
PHP面向对象之旅:深入理解static变量与方法
Jan 06 PHP
php的SimpleXML方法读写XML接口文件实例解析
Jun 16 PHP
PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例
Jul 15 PHP
PHP实现绘制3D扇形统计图及图片缩放实例
Oct 01 PHP
WordPress中获取所使用的模板的页面ID的简单方法
Dec 31 PHP
php抽奖概率算法(刮刮卡,大转盘)
Apr 17 PHP
PHP多线程模拟实现秒杀抢单
Feb 07 PHP
PHP实现的猴王算法(猴子选大王)示例
Apr 30 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
CI框架给视图添加动态数据
2014/12/01 PHP
CI框架中通过hook的方式实现简单的权限控制
2015/01/07 PHP
PHP实现批量上传单个文件
2015/12/29 PHP
用PHP写的一个冒泡排序法的函数简单实例
2016/05/26 PHP
Locate a File Using a File Open Dialog Box
2007/06/18 Javascript
jQuery实现的立体文字渐变效果
2010/05/17 Javascript
jquery 学习之二 属性(html()与html(val))
2010/11/25 Javascript
HTML DOM的nodeType值介绍
2011/03/31 Javascript
深入理解jQuery中live与bind方法的区别
2013/12/18 Javascript
jQuery1.9.1针对checkbox的调整方法(prop)
2014/05/01 Javascript
jQuery实现加入购物车飞入动画效果
2015/03/14 Javascript
js创建对象的方法汇总
2016/01/07 Javascript
jquery validation验证表单插件
2017/01/07 Javascript
微信小程序 定位到当前城市实现实例代码
2017/02/23 Javascript
使用 jQuery 实现表单验证功能
2017/07/05 jQuery
JavaScript设计模式之模板方法模式原理与用法示例
2018/08/07 Javascript
vue鼠标移入添加class样式,鼠标移出去除样式(active)实现方法
2018/08/22 Javascript
简单了解node npm cnpm的具体使用方法
2019/02/27 Javascript
基于JS开发微信网页录音功能的实例代码
2019/04/30 Javascript
在vue中使用jsonp进行跨域请求接口操作
2020/10/29 Javascript
在python中使用requests 模拟浏览器发送请求数据的方法
2018/12/26 Python
浅谈对pytroch中torch.autograd.backward的思考
2019/12/27 Python
如何使用Python发送HTML格式的邮件
2020/02/11 Python
Python json转字典字符方法实例解析
2020/04/13 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
2020/09/03 Python
python 实现&quot;神经衰弱&quot;翻牌游戏
2020/11/09 Python
HTML5 在canvas中绘制矩形附效果图
2014/06/23 HTML / CSS
HTML5 Video标签的属性、方法和事件汇总介绍
2015/04/24 HTML / CSS
国外平面设计第一市场:99designs
2016/10/25 全球购物
伦敦剧院门票:London Theatre Direct
2018/11/21 全球购物
彪马英国官网:PUMA英国
2019/02/11 全球购物
德国专业木制品经销商:Holz-Direkt24
2019/12/26 全球购物
户外宣传策划方案
2014/05/25 职场文书
创业计划书之酒店
2019/08/30 职场文书
Navicat连接MySQL错误描述分析
2021/06/02 MySQL
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
2022/04/02 Servers