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 相关文章推荐
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
Jun 29 PHP
php中time()和mktime()方法的区别
Sep 28 PHP
PHP中的Memcache详解
Apr 05 PHP
php准确计算复活节日期的方法
Apr 18 PHP
php curl模拟post请求和提交多维数组的示例代码
Nov 19 PHP
PHP Header失效的原因分析及解决方法
Nov 16 PHP
PHP获取input输入框中的值去数据库比较显示出来
Nov 16 PHP
php 如何禁用eval() 函数实例详解
Dec 01 PHP
通过修改Laravel Auth使用salt和password进行认证用户详解
Aug 17 PHP
php实现文章评论系统
Feb 18 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
Mar 23 PHP
Laravel 修改验证异常的响应格式实例代码详解
May 25 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
phpBB BBcode处理的漏洞
2006/10/09 PHP
用PHP查询搜索引擎排名位置的代码
2010/01/05 PHP
关于php curl获取301或302转向的网址问题的解决方法
2011/06/02 PHP
[原创]php简单防盗链验证实现方法
2016/07/09 PHP
jquery不支持toggle()高(新)版本的问题解决
2016/09/24 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
解决Laravel blade模板转义html标签的问题
2019/09/03 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
新老版本juqery获取radio对象的方法
2010/03/01 Javascript
jQuery Trim去除字符串首尾空字符的实现方法说明
2014/02/11 Javascript
window.location不跳转的问题解决方法
2014/04/17 Javascript
js监控IE火狐浏览器关闭、刷新、回退、前进事件
2014/07/23 Javascript
js实现基于正则表达式的轻量提示插件
2015/08/29 Javascript
flag和jq on 的绑定多个对象和方法(必看)
2017/02/27 Javascript
在vue项目中使用element-ui的Upload上传组件的示例
2018/02/08 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
2019/11/26 Javascript
vue实现的封装全局filter并统一管理操作示例
2020/02/02 Javascript
使用Python获取Linux系统的各种信息
2014/07/10 Python
自己使用总结Python程序代码片段
2015/06/02 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
2017/09/24 Python
详解K-means算法在Python中的实现
2017/12/05 Python
python开启摄像头以及深度学习实现目标检测方法
2018/08/03 Python
Python函数返回不定数量的值方法
2019/01/22 Python
在Python中使用turtle绘制多个同心圆示例
2019/11/23 Python
Python 解决OPEN读文件报错 ,路径以及r的问题
2019/12/19 Python
Python模块future用法原理详解
2020/01/20 Python
教你如何用python操作摄像头以及对视频流的处理
2020/10/12 Python
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
会话Bean的种类
2013/11/07 面试题
工程力学专业毕业生求职信
2013/10/06 职场文书
内科护士实习自我鉴定
2013/10/17 职场文书
优秀社区干部事迹材料
2014/02/03 职场文书
公益广告语集锦
2014/03/13 职场文书
驻村工作先进事迹
2014/08/14 职场文书
2016年中学植树节活动总结
2016/03/16 职场文书
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
2022/08/14 Python