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代码
Apr 09 PHP
解析如何屏蔽php中的phpinfo()函数
Jun 06 PHP
深入php处理整数函数的详解
Jun 09 PHP
PHP实现邮件群发的源码
Jun 18 PHP
PHP生成Gif图片验证码
Oct 27 PHP
php实现图片上传、剪切功能
May 07 PHP
PHP7新增运算符用法实例分析
Sep 26 PHP
PHP用PDO如何封装简单易用的DB类详解
Jul 30 PHP
php代码调试利器firephp安装与使用方法分析
Aug 21 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
Jul 09 PHP
PHP容器类的两种实现方式示例
Jul 24 PHP
Laravel 框架路由原理与路由访问实例分析
Apr 14 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数组
2010/11/01 PHP
PHP图片自动裁切应付不同尺寸的显示
2014/10/16 PHP
php外部执行命令函数用法小结
2016/10/11 PHP
解决laravel(5.5)访问public报错的问题
2019/10/12 PHP
Laravel5.1 框架Middleware中间件基本用法实例分析
2020/01/04 PHP
PHP数据源架构模式之表入口模式实例分析
2020/01/23 PHP
JS逆序遍历实现代码
2014/12/02 Javascript
javascript实现简单的二级联动
2015/03/19 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
简单对比分析JavaScript中的apply,call与this的使用
2015/12/04 Javascript
Ionic快速安装教程
2016/06/03 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
2016/12/08 Javascript
JavaScript中关于class的调用方法
2017/11/28 Javascript
深入解析Vue源码实例挂载与编译流程实现思路详解
2019/05/05 Javascript
微信小程序 swiper 组件遇到的问题及解决方法
2019/05/26 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
2020/05/26 Javascript
vue使用nprogress加载路由进度条的方法
2020/06/04 Javascript
Python入门篇之字典
2014/10/17 Python
python目录与文件名操作例子
2016/08/28 Python
python操作列表的函数使用代码详解
2017/12/28 Python
对Python3中的input函数详解
2018/04/22 Python
Python实现的文本对比报告生成工具示例
2018/05/22 Python
通过实例了解python property属性
2019/11/01 Python
Python实现发票自动校核微信机器人的方法
2020/05/22 Python
人事专员工作职责
2014/02/22 职场文书
《盘古开天地》教学反思
2014/02/28 职场文书
广告艺术设计专业自荐书
2014/07/08 职场文书
旅游局领导班子“四风”问题对照检查材料思想汇报
2014/09/29 职场文书
小学班主任自我评价
2015/03/11 职场文书
车间质检员岗位职责
2015/04/08 职场文书
社区活动总结范文
2015/05/07 职场文书
2015年新农村建设指导员工作总结
2015/07/24 职场文书
开学第一天的感想
2015/08/10 职场文书
小学副班长竞选稿
2015/11/21 职场文书
2016大学军训通讯稿
2015/11/25 职场文书
再见,2019我们不负使命;你好,2020我们砥砺前行
2020/01/03 职场文书