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+DBM的同学录程序(3)
Oct 09 PHP
php访问查询mysql数据的三种方法
Oct 09 PHP
Apache2 httpd.conf 中文版
Dec 06 PHP
用PHP生成html分页列表的代码
Mar 18 PHP
php入门学习知识点五 关于php数组的几个基本操作
Jul 14 PHP
基于MySQL分区性能的详细介绍
May 02 PHP
php读取csv文件后,uft8 bom导致在页面上显示出现问题的解决方法
Aug 10 PHP
php中的PHP_EOL换行符详细解析
Oct 26 PHP
PHP获取input输入框中的值去数据库比较显示出来
Nov 16 PHP
redirect_uri参数错误的解决方法(必看)
Feb 16 PHP
LNMP部署laravel以及xhprof安装使用教程
Sep 14 PHP
php-fpm重启导致的程序执行中断问题详解
Apr 29 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 php_openssl.dll的作用
2013/07/01 PHP
json跟xml的对比分析
2008/06/10 Javascript
比较详细的关于javascript 解析json的代码
2009/12/16 Javascript
Jquery 获得服务器控件值的方法小结
2010/05/11 Javascript
jquery html动态生成select标签出问题的解决方法
2013/11/20 Javascript
浅析JQuery UI Dialog的样式设置问题
2013/12/18 Javascript
Jqgrid设置全选(选择)及获取选择行的值示例代码
2013/12/28 Javascript
用简洁的jQuery方法toggleClass实现隔行换色
2014/10/22 Javascript
jQuery移动web开发中的页面初始化与加载事件
2015/12/03 Javascript
JavaScript计划任务后台运行的方法
2015/12/18 Javascript
ionic实现带字的toggle滑动组件
2016/08/27 Javascript
Jquery Easyui进度条组件Progress使用详解(8)
2020/03/26 Javascript
Node.js如何使用Diffie-Hellman密钥交换算法详解
2017/09/05 Javascript
解决在Bootstrap模糊框中使用WebUploader的问题
2018/03/22 Javascript
js实现前面自动补全位数的方法
2018/10/10 Javascript
Vue使用localStorage存储数据的方法
2019/05/27 Javascript
浅入深出Vue之组件使用
2019/07/11 Javascript
vue - vue.config.js中devServer配置方式
2019/10/30 Javascript
微信小程序如何实现radio单选框单击打勾和取消
2020/01/21 Javascript
[59:42]Secret vs Alliacne 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python lambda和Python def区别分析
2014/11/30 Python
python 调用HBase的简单实例
2016/12/18 Python
Python3.5面向对象程序设计之类的继承和多态详解
2019/04/24 Python
如何更改 pandas dataframe 中两列的位置
2019/12/27 Python
PyTorch和Keras计算模型参数的例子
2020/01/02 Python
Scrapy框架介绍之Puppeteer渲染的使用
2020/06/19 Python
pycharm如何使用anaconda中的各种包(操作步骤)
2020/07/31 Python
基于Django集成CAS实现流程详解
2020/11/28 Python
浅析HTML5中的 History 模式
2017/06/22 HTML / CSS
HTML5之消息通知的使用(Web Notification)
2018/10/30 HTML / CSS
为有想象力的人提供的生活方式商店:Firebox
2018/06/04 全球购物
do you have any Best Practice for testing
2016/06/04 面试题
医药学专业大学生职业生涯规划书论文
2014/01/21 职场文书
大学生新学期计划书
2014/04/28 职场文书
董事长岗位职责
2015/02/13 职场文书
2016年小学六一儿童节活动总结
2016/04/06 职场文书