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批量生成缩略图的代码
Jul 19 PHP
The specified CGI application misbehaved by not returning a complete set of HTTP headers
Mar 31 PHP
nginx+php-fpm配置文件的组织结构介绍
Nov 07 PHP
Yii查询生成器(Query Builder)用法实例教程
Sep 04 PHP
php命令行(cli)模式下报require 加载路径错误的解决方法
Nov 23 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
Jan 07 PHP
php中照片旋转 (orientation) 问题的正确处理
Feb 16 PHP
phpstudy的php版本自由修改的方法
Oct 18 PHP
php中isset与empty函数的困惑与用法分析
Jul 05 PHP
php和html的区别点详细总结
Sep 24 PHP
Laravel 创建可以传递参数 Console服务的例子
Oct 14 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
Apr 06 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
yii,CI,yaf框架+smarty模板使用方法
2015/12/29 PHP
php查询操作实现投票功能
2016/05/09 PHP
PHP链表操作简单示例
2016/10/15 PHP
关于php unset对json_encode的影响详解
2018/11/14 PHP
AppBaseJs 类库 网上常用的javascript函数及其他js类库写的
2010/03/04 Javascript
javascript 伪数组实现方法
2010/10/11 Javascript
jquery ajax请求实例深入解析
2012/11/26 Javascript
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
jQuery淡入淡出元素让其效果更为生动
2014/09/01 Javascript
学习javascript面向对象 掌握创建对象的9种方式
2016/01/04 Javascript
jQuery实现图片轮播效果代码
2016/09/27 Javascript
HTML Table 空白单元格补全的简单实现
2016/10/13 Javascript
Bootstrap 轮播(Carousel)插件
2016/12/26 Javascript
微信小程序开发之相册选择和拍照详解及实例代码
2017/02/22 Javascript
基于 webpack2 实现的多入口项目脚手架详解
2017/06/26 Javascript
javaScript和jQuery自动加载简单代码实现方法
2017/11/24 jQuery
JavaScript实现职责链模式概述
2018/01/25 Javascript
jQuery代码优化方法总结
2018/01/29 jQuery
简单了解微信小程序 e.target与e.currentTarget的不同
2019/09/27 Javascript
vue.js实现双击放大预览功能
2020/06/23 Javascript
Python中使用异常处理来判断运行的操作系统平台方法
2015/01/22 Python
python3.7简单的爬虫实例详解
2019/07/08 Python
简单了解python反射机制的一些知识
2019/07/13 Python
pytorch 可视化feature map的示例代码
2019/08/20 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
2020/05/22 Python
基于pytorch中的Sequential用法说明
2020/06/24 Python
CSS3 border-radius圆角的实现方法及用法详解
2020/09/14 HTML / CSS
科沃斯机器人官网商城:Ecovacs
2016/08/29 全球购物
Holland & Barrett爱尔兰:英国领先的健康零售商
2019/03/31 全球购物
六个一活动实施方案
2014/03/21 职场文书
股东合作协议书范本
2014/04/14 职场文书
班子群众路线教育实践个人对照检查材料思想汇报
2014/09/30 职场文书
推荐信范文大全
2015/03/27 职场文书
海底两万里读书笔记
2015/06/26 职场文书
一篇文章带你复习java知识点
2021/06/28 Java/Android
部分武汉产收音机展览
2022/04/07 无线电