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截断标题且兼容utf8和gb2312编码
Sep 22 PHP
php中过滤非法字符的具体实现
Oct 29 PHP
php解决约瑟夫环示例
Apr 09 PHP
ThinkPHP中ajax使用实例教程
Aug 22 PHP
php通过分类列表产生分类树数组的方法
Apr 20 PHP
PHP cURL初始化和执行方法入门级代码
May 28 PHP
phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法
Mar 30 PHP
使用JavaScript创建新样式表和新样式规则
Jun 14 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
Jun 15 PHP
php array_values 返回数组的所有值详解及实例
Nov 12 PHP
php无限级评论嵌套实现代码
Apr 18 PHP
php数组和链表的区别总结
Sep 20 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版(3)
2006/10/09 PHP
php设计模式 Delegation(委托模式)
2011/06/26 PHP
PHP查找一列有序数组是否包含某值的方法
2020/02/07 PHP
关于IE7 IE8弹出窗口顶上
2008/12/22 Javascript
jQuery EasyUI 中文API Button使用实例
2010/04/14 Javascript
jQuery之浮动窗口实现代码(两种方法)
2010/09/08 Javascript
JavaScript之HTMLCollection接口代码
2011/04/27 Javascript
让jQuery Mobile不显示讨厌loading界面的方法
2014/02/19 Javascript
javascript屏蔽右键代码
2014/05/15 Javascript
javascript实现iframe框架延时加载的方法
2014/10/30 Javascript
js操作数组函数实例小结
2015/12/10 Javascript
js原型链与继承解析(初体验)
2016/05/09 Javascript
jQuery EasyUI菜单与按钮详解
2016/07/13 Javascript
无循环 JavaScript(map、reduce、filter和find)
2017/04/08 Javascript
详解vue组件化开发-vuex状态管理库
2017/04/10 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
2017/07/18 Javascript
微信小程序 同步请求授权的详解
2017/08/04 Javascript
angularJs 表格添加删除修改查询方法
2018/02/27 Javascript
Angular 4.x+Ionic3踩坑之Ionic 3.x界面传值详解
2018/03/13 Javascript
JS中的事件委托实例浅析
2018/03/22 Javascript
在antd中setFieldsValue和defaultVal的用法
2020/10/29 Javascript
如何利用Fabric自动化你的任务
2016/10/20 Python
Python类的继承和多态代码详解
2017/12/27 Python
python使用生成器实现可迭代对象
2018/03/20 Python
linux查找当前python解释器的位置方法
2019/02/20 Python
python实现抽奖小程序
2020/04/15 Python
详解pycharm连接不上mysql数据库的解决办法
2020/01/10 Python
django inspectdb 操作已有数据库数据的使用步骤
2021/02/07 Python
印度民族服装购物网站:BIBA
2019/08/05 全球购物
人事经理岗位职责
2014/04/28 职场文书
党委班子对照检查材料
2014/08/19 职场文书
员工自我评价范文
2015/03/11 职场文书
小学生心理健康活动总结
2015/05/08 职场文书
2016年少先队活动总结
2016/04/06 职场文书
python批量更改目录名/文件名的方法
2021/04/18 Python
Python数据可视化之用Matplotlib绘制常用图形
2021/06/03 Python