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 相关文章推荐
基于mysql的论坛(6)
Oct 09 PHP
PHP MSSQL 存储过程的方法
Dec 24 PHP
php文件上传表单摘自drupal的代码
Feb 15 PHP
遍历指定目录下的所有目录和文件的php代码
Nov 27 PHP
PHP中4个加速、缓存扩展的区别和选用建议
Mar 12 PHP
PHP 双链表(SplDoublyLinkedList)简介和使用实例
May 12 PHP
php中删除、清空session的方式总结
Oct 09 PHP
WordPress开发中的get_post_custom()函数使用解析
Jan 04 PHP
PHP中的Trait 特性及作用
Apr 03 PHP
php实现异步将远程链接上内容(图片或内容)写到本地的方法
Nov 30 PHP
php实现的pdo公共类定义与用法示例
Jul 19 PHP
PHP树形结构tree类用法示例
Feb 01 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
浅析用prototype定义自己的方法
2013/11/14 Javascript
更高效的使用JQuery 这里总结了8个小技巧
2016/04/13 Javascript
AngularJs入门教程之环境搭建+创建应用示例
2016/11/01 Javascript
Vue使用vue-area-linkage实现地址三级联动效果的示例
2018/06/27 Javascript
基于vue.js中关于下拉框的值默认及绑定问题
2018/08/22 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
2018/09/21 Javascript
微信小程序和H5页面间相互跳转代码实例
2019/09/19 Javascript
SSM+layUI 根据登录信息显示不同的页面方法
2019/09/20 Javascript
nodeJs的安装与npm全局环境变量的配置详解
2020/01/06 NodeJs
node+multer实现图片上传的示例代码
2020/02/18 Javascript
python读取Android permission文件
2013/11/01 Python
Python中的类与对象之描述符详解
2015/03/27 Python
Python中 Lambda表达式全面解析
2016/11/28 Python
Python 专题四 文件基础知识
2017/03/20 Python
python记录程序运行时间的三种方法
2017/07/14 Python
浅析python参数的知识点
2018/12/10 Python
Python利用matplotlib做图中图及次坐标轴的实例
2019/07/08 Python
Pandas透视表(pivot_table)详解
2019/07/22 Python
Python通过TensorFLow进行线性模型训练原理与实现方法详解
2020/01/15 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
2020/05/22 Python
使用BeautifulSoup4解析XML的方法小结
2020/12/07 Python
pycharm实现猜数游戏
2020/12/07 Python
python UIAutomator2使用超详细教程
2021/02/19 Python
移动Web—CSS为Retina屏幕替换更高质量的图片
2012/12/24 HTML / CSS
详解HTML5 LocalStorage 本地存储
2016/12/23 HTML / CSS
电子商务应届生求职信
2013/11/16 职场文书
国际贸易专业个人求职信范文分享
2013/12/14 职场文书
关于赌博的检讨书
2014/01/08 职场文书
教师研修随笔感言
2014/01/23 职场文书
教学器材管理制度
2014/01/26 职场文书
黄河的主人教学反思
2014/02/07 职场文书
高中学生评语大全
2014/04/25 职场文书
公司离职证明范本(汇总)
2014/09/10 职场文书
感动中国何玥观后感
2015/06/02 职场文书
Linux系统下安装PHP7.3版本
2021/06/26 PHP
netty 实现tomcat的示例代码
2022/06/05 Servers