Smarty模板类内部原理实例分析
本文实例讲述了Smarty模板类内部原理。分享给大家供大家参考,具体如下:
之前在学习ThinkPHP的时候,有接触到Smarty模板类,但是一直不知道其内部实现的原理,博主今天终于知道了其内部原理,其实也挺简单的,然后写了一个迷你版的Smarty模板类,对理解其内部原理有了很大的帮助。
1、迷你版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_dir 、compile_dir‘和tpl_var,含义分别是模板文件的路径、编译后文件的路径、模板对象的变量。3个方法分别是assign、display和compile,assign方法是给模板对象赋值,display方法是编译模板文件,并引入(显示)编译后的文件,compile方法是编译模板文件。编译模板文件的过程主要是将模板文件中的{标签}解析成<?php echo
2、Smarty原理分析
工作流程
(1)把需要显示的全局变量,赋值,塞到对象的内部属性中的一个数组里 (2)然后编译模板,将{$标签}解析成相应的php echo 代码 (3)引入编译后的php文件
使用步骤
(1)Smarty是一个类,要使用的话,必须引入在进行实例化 (2)使用assign给模板赋值 (3)使用display方法【从编译到输出】
Smarty的缺点
(1)编译模板,浪费时间 (2)要把变量再重新赋值到对象的属性中,增大了开销
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 微服务使用 Hystrix 实现服务降级
- SpringMVC源码学习(三) - 请求处理的流程
- Hadoop框架:集群模式下分布式环境搭建
- 微服务 Hystrix 实现服务熔断
- 微服务 Gateway 的基本配置
- 有赞营销逆向域的探索与实践
- RabbitMQ 启动报错:Error: unable to perform an operation on node ‘rabbit@***‘. Please see diagnostics...
- MySQL|查询字段数量多少对查询效率的影响
- 如果MySQL事务中发生了网络异常?
- MySQL|update字段为相同的值是否会记录binlog
- 微服务配置 Config 与消息总线
- 贷款违约预测-Task5 模型融合
- Python字符串
- MYSQL logstash 同步数据到es的几种方案对比以及每种方案数据丢失原因分析。
- 手写“SpringBoot”:几十行代码基于Netty搭建一个 HTTP Server