//php 控制器文件

<?php
//引入模板引擎文件
include("20130304.php");
$smarty =newTinySmarty();
$qq_numbers=array('a1'=>'12333','a2'=>'2222222','a3'=>'333333','a4'=>'3333333');
$smarty->assign($qq_numbers);
$smarty->assign('title','这是我的QQ号码');
$smarty->assign('contents','这是我的QQ:1211884772');
$smarty->display('20120305_01.html');

?>

模板引擎类20130304.php

<?php
/***
smarty模板引擎原理
1:读取模板文件
2:替换模板标签为php可执行代码
3:保存替换成功的php文件
***/
/*
问题?
1:每次访问都编译浪费cpu?
编译文件存在,不用在编译直接引入
2:模板文件修改后,必须重新编译该文件
当模板文件修改时间大于编译文件修改时间,说明模板文件被修改了,
因此要重新编译模板文件
*/
classTinySmarty{
 //模板文件存放目录
 public $template_dir="./templates/";
 //编译后文件存放目录
 public $compile_dir="./c_templates/";

//存放变量值
 public $tpl_vars=array();

//assign
 //将变量以数组形式存放到该$tpl_var属性
 publicfunction assign($tpl_var,$var=null){
  //传入数组形式,为批量赋值
  if(is_array($tpl_var)){
   foreach($tpl_var as $_key=>$_val){
    if($_key!=''){
     $this->tpl_vars[$_key]= $_val;
    }
   }
  }else{
   //传入非空字符
   if($tpl_var!=''){
    $this->tpl_vars[$tpl_var]= $var;
   }
  }
 }

/*
 name display
 param string $tpl_file 文件名

*/
 publicfunction display($tpl_file){
  //模板文件路径
  $template_file_path = $this->template_dir.$tpl_file;
  //编译文件路径
  $compile_file_path = $this->compile_dir.$tpl_file;
  //判断编译文件是否存在
  if(!file_exists($compile_file_path)||filemtime($template_file_path)>filemtime($compile_file_path)){
   //判断文件是否存在
   if(!file_exists($template_file_path)){
   returnfalse;
   }
   //读取文件内容
   $fpl_file_con = file_get_contents($template_file_path);

//替换模板标签
   //如:{$title} 替换为<?php echo $title; ? >
   //正则表达式//此处正则涉及到正则的反响引用
   $pattern ='/{\s*\$([_a-zA-Z][_0-9a-zA-Z]*)\s*\}/i';
   $replace ='<?php echo $this->tpl_vars["${1}"];?>';
   $new_file_con= preg_replace($pattern,$replace,$fpl_file_con);
   //写入文件内容
   file_put_contents($compile_file_path,$new_file_con);
  }

//引入编译后的文件
  include ($compile_file_path);
 }
}

?>


模板文件20120305_01.html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>{$title}</title>
</head>
<body>
<h1>hello-</h1>
{$contents}
</body>
</html>

smarty模板引擎原理解析的更多相关文章

  1. 迷你版 smarty --模板引擎和解析

    http://blog.ipodmp.com/archives/php-write-a-mini-smarty-template-engine/ 迷你版Smarty模板引擎目录结构如下: ① 要开发一 ...

  2. 高性能JavaScript模板引擎原理解析

    随着 web 发展,前端应用变得越来越复杂,基于后端的 javascript(Node.js) 也开始崭露头角,此时 javascript 被寄予了更大的期望,与此同时 javascript MVC ...

  3. Smarty模板引擎原理概述

    smarty(模板引擎,模板技术) 使用smarty主要是为了实现逻辑和外在内容的分离: 特点: 1.速度快(因为第二次执行的时候使用第一次执行时生成的编译文件) 2.缓存技术(正是因为缓存技术,使得 ...

  4. 深入浅出之Smarty模板引擎工作机制(二)

    源代码下载地址:深入浅出之Smarty模板引擎工作机制 接下来根据以下的Smarty模板引擎原理流程图开发一个自己的模板引擎用于学习,以便加深理解. Smarty模板引擎的原理,其实是这么一个过程: ...

  5. 深入浅出之Smarty模板引擎工作机制(一)

    深入浅出Smarty模板引擎工作机制,我们将对比使用smarty模板引擎和没使用smarty模板引擎的两种开发方式的区别,并动手开发一个自己的模板引擎,以便加深对smarty模板引擎工作机制的理解. ...

  6. 写一个迷你版Smarty模板引擎,对认识模板引擎原理非常好(附代码)

    前些时间在看创智博客韩顺平的Smarty模板引擎教程,再结合自己跟李炎恢第二季开发中CMS系统写的tpl模板引擎.今天就写一个迷你版的Smarty引擎,虽然说我并没有深入分析过Smarty的源码,但是 ...

  7. Smarty模板引擎技术二

    Smarty模板引擎技术 内建函数 include_php内建函数 作用:载入一个php文件,将载入的文件的内容赋值给一个变量   注意:该内建函数只能在2.0中使用,如果使用的话,必须得实例化Sma ...

  8. JavaScript模板引擎原理

    JavaScript模板引擎原理,几行代码的事儿 2013-12-03 16:35 by BarretLee, 650 阅读, 6 评论, 收藏, 编辑 一.前言 什么是模板引擎,说的简单点,就是一个 ...

  9. Smarty模板引擎技术

    Smarty模板引擎技术 什么是模板引擎? 什么是Smarty模板引擎? 为何选择Smarty模板引擎? 如何使用Smarty模板引擎? 一.历史背景 场景一:回顾之前编写PHP项目的方式 //链接数 ...

随机推荐

  1. hbulider 快捷键以及常用

    跳转到行        Ctrl + G   页首        Ctrl + Home   页尾        Ctrl + End   下一个选项卡        Ctrl + Tab   上一个 ...

  2. in和exists的区别与SQL执行效率分析

    可总结为:当子查询表比主查询表大时,用Exists:当子查询表比主查询表小时,用in SQL中in可以分为三类: 1.形如select * from t1 where f1 in ('a','b'), ...

  3. Jmeter聚合报告分析

    Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值 Average:平均响应时间--默认情况下是单个 Re ...

  4. NPOI组件集锦

    关于NPOI不错的介绍:http://www.cnblogs.com/restran/p/3889479.html http://www.cnblogs.com/Irving/archive/2012 ...

  5. rnqoj-99-配置魔药-dp

    比较好的题目~~ dp[j][k]: 第一个容器在第i秒和第二个容器在第j秒,所产生的最大魔力. if(num[i].t2<=j)dp[j][k]=max(dp[j][k],dp[num[i]. ...

  6. android79 Fragment生命周期

    切换成01时依次调用onCreate,onStart,onResume方法,切换到03的时候01依次onPause,onStop,onDestroy,03依次onCreate,onStart,onRe ...

  7. Android 动画及属性动画

    Android 平台提供了一套完整的动画框架,在Android3.0之前有两种动画Tween Animation(补间动画)和Frame Animation(帧动画), 对应SDK中的View Ani ...

  8. 超过2T,磁盘分区

    MBR:MBR分区表(即主引导记录)大家都很熟悉.所支持的最大卷:2T,而且对分区有限制:最多4个主分区或3个主分区加一个扩展分区 GPT: GPT(即GUID分区表).是源自EFI标准的一种较新的磁 ...

  9. Windows Server 2008 R2 安装及配置指南

    一.安装需求: 1. 硬件需求条件 硬件 需求 处理器 最低:1.4 GHz(x64处理器) 注意:Windows Server 2008 for Itanium-Based Systems 版本需要 ...

  10. javascript常用插件

    Math.uuid.js 功能:js 版生成uuid 地址:http://www.broofa.com/ jquery.waterfall.js 功能:瀑布布局图片 地址:https://github ...