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.MVC的模板标签系统(五)
Sep 05 PHP
特转载一高手总结PHP学习资源和链接.
Dec 05 PHP
php下关于Cannot use a scalar value as an array的解决办法
Aug 08 PHP
php中stream(流)的用法
Mar 25 PHP
PHPUnit安装及使用示例
Oct 29 PHP
php数组排序usort、uksort与sort函数用法
Nov 17 PHP
php eval函数一句话木马代码
May 21 PHP
使用php+swoole对client数据实时更新(一)
Jan 07 PHP
php中的登陆login实例代码
Jun 20 PHP
PHP实现bitmap位图排序与求交集的方法
Jul 28 PHP
php flush无效,IIS7下php实时输出的方法
Aug 25 PHP
微信公众平台开发教程①获取用户Openid及个人信息图文详解
Apr 10 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
CodeIgniter php mvc框架 中国网站
2008/05/26 PHP
不重新编译PHP为php增加openssl模块的方法
2011/06/14 PHP
Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解
2013/06/02 PHP
解析php常用image图像函数集
2013/06/24 PHP
destoon首页调用求购供应信息的地区名称的方法
2014/08/21 PHP
php中的登陆login实例代码
2016/06/20 PHP
JavaScript实现删除电脑的关机键
2016/07/26 PHP
php array_values 返回数组的所有值详解及实例
2016/11/12 PHP
PHP实现的服务器一致性hash分布算法示例
2018/08/09 PHP
JavaScript 判断判断某个对象是Object还是一个Array
2010/01/28 Javascript
Jquery Select操作方法集合脚本之家特别版
2010/05/17 Javascript
jquery中表单 多选框的一种巧妙写法
2015/09/06 Javascript
使用jquery给指定的table动态添加一行、删除一行
2016/10/13 Javascript
详解Vue微信公众号开发踩坑全记录
2017/08/21 Javascript
jQuery菜单实例(全选,反选,取消)
2017/08/28 jQuery
详解vue-cli@2.x项目迁移日志
2019/06/06 Javascript
微信小程序 云开发模糊查询实现解析
2019/09/02 Javascript
jquery获取input输入框中的值
2019/11/13 jQuery
js中复选框的取值及赋值示例详解
2020/10/18 Javascript
python基础教程之Hello World!
2014/08/29 Python
Python实现读取txt文件并转换为excel的方法示例
2018/05/17 Python
python 图片去噪的方法示例
2019/07/09 Python
Pytorch中的variable, tensor与numpy相互转化的方法
2019/10/10 Python
解决Keras 自定义层时遇到版本的问题
2020/06/16 Python
海信商城:海信电视、科龙空调、容声冰箱官方专卖
2017/02/07 全球购物
跟单文员岗位职责
2014/01/03 职场文书
公立医院改革实施方案
2014/03/14 职场文书
请假条的格式
2014/04/11 职场文书
服务之星事迹材料
2014/05/03 职场文书
2014年话务员工作总结
2014/11/19 职场文书
2014年青年教师工作总结
2014/12/17 职场文书
2015年复活节活动总结
2015/02/27 职场文书
创先争优活动个人总结
2015/03/04 职场文书
标准版个人借条怎么写?以及什么是借条?
2019/08/28 职场文书
Nginx虚拟主机的搭建的实现步骤
2022/01/18 Servers
Netty分布式客户端接入流程初始化源码分析
2022/03/25 Java/Android