PHP中面向对象中的模板引擎类

<?php

/**
* 模版引擎类
*/
class Tpl
{

	//缓存目录
	protected $cacheDir = ‘./Cache/‘;
	//模版目录
	protected $tplDir = ‘./Tpl/‘;
	//保存变量的成员方法
	protected $vars = [];
	//缓存有效期
	protected $cacheLifeTime = 3600;

	//初始化成员属性
	public function __construct($tplDir = null ,$cacheDir = null ,$cacheLifeTime = null)
	{
		//判断缓存目录是否存在
		if (isset($tplDir)) {
			if ($this->_checkDir($tplDir)) {
				$this->tplDir = rtrim($tplDir,‘/‘) . ‘/‘;
			}
		}
		//判断模板路径是否存在  如果不存在要创建,权限是否可写 就需要更改权限
		if (isset($cacheDir)) {
			if ($this->_checkDir($cacheDir)) {
				$this->tplDir = rtrim($cacheDir,‘/‘) . ‘/‘;
			}
		}
		//初始化缓存时间
		if (isset($cacheLifeTime)) {
			$thsi->cacheLifeTime = $cacheLifeTime;
		}
	}

	//目录的创建以及权限的处理
	private function _checkDir($path)
	{
		//判断是否存在目录以及是否是目录
		if (!file_exists($path) || !is_dir($path)) {
			 return mkdir($path,0755,true);
		}

		//判断目录的权限是否可读可写
		if (!is_readable($path) || !is_writable($path)) {
			return chmod($path,0755);
		}

		return true;
	}

	//分配变量 主要的目的是将模板中需要处理的代码在php中替换做准备
	public function assign($key,$val)
	{
		$this->vars[$key] = $val;

	}

	//display 显示模板文件
	public function display($file,$isExecute = true ,$uri = null)
	{

	   	//获得模板路径(模板目录路径+模板文件)
	   	$tplFilePath = $this->tplDir.$file;
		//判断文件是否存在
		if (!file_exists($tplFilePath)) {
			exit(‘模板文件不存在‘);		}
		//获得编译文件路径(组合一个全新的文件名和路径)
		$cacheFile = md5($file.$uri) . ‘.php‘;

		$cacheFilePath  = $this->cacheDir . $cacheFile;

		//检测是否编译过 是否修改过模板文件 如果变编译过 而且在有效期内则不编译
		if (!file_exists($cacheFilePath)) {
			$html = $this->compile($tplFilePath);

		} else {

			//如果修改过模版文件  就需要删除原来的编译文件重新编译
			if (filemtime($tplFilePath) > filemtime($cacheFilePath)) {

				//删除原来的文件
				unlink($cacheFilePath);

				//重新编译
				$html = $this->compile($tplFilePath);

			}

			//文件创建时间+缓存有效期 > time() [当前时间], 没有过期  否则过期
			$isTimeout = (filemtime($tplFilePath) + $this->cacheLifeTime > time()) ? false : true;

			if ($isTimeout) {
				$html = $this->compile($tplFilePath);
			}
		}

		//编译
		if (isset($html)) {
			if (!file_put_contents($cacheFilePath, $html)) {
				exit(‘编译文件写入失败‘);
			}
		}

		//执行
		if ($isExecute) {
			extract($this->vars);
			include $cacheFilePath;
		}
	}

	//编译的方法  将html的php代码替换成php代码来执行 并且生成一个缓存
	protected function compile($tplFilePath)
	{
		//将整个文件读入一个字符串
		$html = file_get_contents($tplFilePath);

		//正则替换规则
		$keys = [
			‘{if %%}‘ => ‘<?php if(\1): ?>‘,
            ‘{else}‘ => ‘<?php else : ?>‘,
            ‘{else if %%}‘ => ‘<?php elseif(\1) : ?>‘,
            ‘{elseif %%}‘ => ‘<?php elseif(\1) : ?>‘,
            ‘{/if}‘ => ‘<?php endif;?>‘,
            ‘{$%%}‘ => ‘<?=$\1;?>‘,
            ‘{foreach %%}‘ => ‘<?php foreach(\1) :?>‘,
            ‘{/foreach}‘ => ‘<?php endforeach;?>‘,
            ‘{for %%}‘ => ‘<?php for(\1):?>‘,
            ‘{/for}‘ => ‘<?php endfor;?>‘,
            ‘{while %%}‘ => ‘<?php while(\1):?>‘,
            ‘{/while}‘ => ‘<?php endwhile;?>‘,
            ‘{continue}‘ => ‘<?php continue;?>‘,
            ‘{break}‘ => ‘<?php break;?>‘,
            ‘{$%% = $%%}‘ => ‘<?php $\1 = $\2;?>‘,
            ‘{$%%++}‘ => ‘<?php $\1++;?>‘,
            ‘{$%%--}‘ => ‘<?php $\1--;?>‘,
            ‘{comment}‘ => ‘<?php /* ‘,
            ‘{/comment}‘ => ‘ */ ?>‘,
            ‘{/*}‘ => ‘<?php /* ‘,
            ‘{*/}‘ => ‘* ?>‘,
            ‘{section}‘ => ‘<?php ‘,
            ‘{/section}‘ => ‘?>‘,
			‘{{%%(%%)}}‘ => ‘<?=\1(\2);?>‘,

			‘{include %%}‘ => ‘<?php include "\1";?>‘,

		];

			//通过遍历 然后一一替换
		foreach ($keys as $key => $value) {
				//正则匹配替换
			$patten = ‘#‘ . str_replace(‘%%‘, ‘(.+)‘, preg_quote($key,‘#‘)) . ‘#imsU‘;

			$replace = $value;

			//包含文件处理 include处理方式不一样
			if (stripos($patten, ‘include‘)) {
				// 执行一个正则表达式搜索并且使用一个回调进行替换
				$html = preg_replace_callback($patten, array($this,‘parseInclude‘), $html);

			} else {

				$html = preg_replace($patten, $replace, $html);
			}

		}
		return $html;

	}

	protected function parseInclude($data)
	{

		$file = str_replace([‘\‘‘,‘"‘],‘‘,$data[1]);

		$path = $this->parsePath($file);

		$this->display($file,false);

		return ‘<?php  include "‘ . $path . ‘";?>‘;
	}

	//处理文件名  将汉字符号等统一设置为32位的加密文件名
	protected function parsePath($file)
	{

		$path = $this->cacheDir . md5($file).‘.php‘;

		return $path;
	}

	//删除缓存文件(递归)
	public function clearCache()
	{
		self::delDir($this->cacheDir);
	}

	//递归删除缓存的文件
	public static function delDir($path)
	{
		$res = opendir($path);

		while($file = readdir($res)){
			if ($file == ‘.‘ || $file == ‘..‘) {
				continue;
			}

			$newPath = $path.‘/‘.$file;

			if (is_dir($newPath)) {

				self::delDir($newpath);
			} else {
				unlink($newPath);
			}
		}
	}

}

测试代码:

$tpl = new Tpl();
$tpl->assign(‘hello‘,‘world‘);
$tpl->assign(‘chensen‘,‘你好森林么么哒‘);

$tpl->display(‘index.html‘);
时间: 2024-11-05 06:41:12

PHP中面向对象中的模板引擎类的相关文章

PHP 自定义 Smarty 模板引擎类 高洛峰 细说PHP

smarty模板引擎类简单工作原理 利用Smarty 模板引擎类对模板文件中的变量进行编译,编译过程其实就是利用正则表达式翻译成PHP文件.例如 模板文件中{$title} 利用正则表达式找到并替换成  <?php echo $this->vars['title'];?> 自定义 Smarty 模板引擎类 smarty.class.php页面 <?php /*  * 自定义Smarty模板引擎类  */         class Smarty{             priva

Express框架中如何引用ejs模板引擎

原文地址:http://www.cnblogs.com/greenteaone/p/3685733.html 1.如何在项目中安装ejs模板引擎 在NodeJS指南中利用利用以下命令建立网站的基本结构: express -t ejs microblog 运行这个命令后继续运行 cd microblog && npm install(安装项目的依赖属性), 发现安装的模板引擎是jade,而不是ejs.原因是现在的版本已经没有-t这个命令了,改为 express -e  microblog 运

在Express中配置使用art-template模板引擎

先安装需要使用的包 cnpm install --save art-templatecnpm install --save express-art-template 配置(官网案例) var express = require('express') var express = require('express'); var app = express();//配置使用art-template模板引擎//第一个参数表示,当渲染以 .art 结尾时使用art-template模板引擎//expres

模板引擎类dedetemplate.class.php使用说明【转自织梦官方】

1.概述 织梦的模板标签类似于XML格式,所有的模板都含有定界符,默认情况下是{dede:*}和{/dede:*},“*”代表模板标记名称. 一般情况下{dede:*}和{/dede:*}是成对出现的. 每个模板都会生成一个模板缓存文件,默认是在站点根目录data/tplcache目录.在模板调试的时候可以查看缓存中编译后的模板文件. 如果需要在开发中使用,则需要引用dedetemplate.class.php文件: $tpl = new DedeTemplate(     模板对象实例名称,通

PHP的常用的几大模板引擎

SmartySmarty的特点是将模板编译成PHP脚本,然后执行这些脚本.很快,非常灵活. Heyes Template Class一个非常容易使用,但功能强大并且快速的模板引擎,它帮助你把页面布局和设计从代码中分离. FastTemplate一个简单的变量插值模板类,它分析你的模板,把变量的值从HTML代码中分离处理. ShellPage一个简单易用的类,可以让你的整个网站布局基于模板文件,修改模板就能改变整个站点. STP Simple Template Parser一个简单.轻量级并且易于

Django基础,Day10 - template 模板引擎与路径设置

作为一个Web框架,Django需要一个方便的方式来生成动态的HTML.最常见的方法依赖于模板.模板包含所需的HTML输出的静态部分以及一些特殊的语法描述如何插入动态内容. Django框架后端默认支持自生内置的一套模板系统DTL(Django Template Language) 和 有名的Jinja2模板系统.当然,也可以从第三方模块中之前其他模板系统.如果没有特殊要求,建议使用Django自带的DTL模板系统,这也是django 1.8之前唯一可以的内置选项. TEMPLATE 默认配置

php模板引擎原理

模板引擎实现的原理 访问php文件, php文件会去加载模板引擎,通过模板引擎去加载模板然后替换模板里面的变量 然后生成一个编译文件 最后将该编译文件导入 访问的php文件中输出 第二次访问的时候 如果 缓存文件存在或者没有被改动则直接 导入缓存文件 输出 否则重新编译 自定义的一个模板引擎 mytpl.class.php <?php class mytpl{ //指定模板目录 private $template_dir; //编译后的目录 private $compile_dir; //读取模

Spring MVC 学习总结(七)——FreeMarker模板引擎与动态页面静态化

模板引擎可以让程序实现界面与数据分离,业务代码与逻辑代码的分离,这就提升了开发效率,良好的设计也使得代码复用变得更加容易.一般的模板引擎都包含一个模板解析器和一套标记语言,好的模板引擎有简洁的语法规则.强大的功能.高效的渲染效率.详尽的帮助说明与不断的更新与维护.常见的前端模板引擎有: 常用的java后台模板引擎:jsp.FreeMarker.Velocity等. 请不要迷恋速度,为了推广的测试可能是片面的,好的模板引擎经得起时间考验,建议大家选择成熟的.常用的模板引擎.另外不管前后端的模板引擎

前端学PHP之自定义模板引擎

什么是网站模板?准确地说,是指网站页面模板,即每个页面仅是一个板式,包括结构.样式和页面布局,是创建网页内容的样板,也可以理解为已有的网页框架.可以将模板中原有的内容替换成从服务器端数据库中动态内容,目的是可以保持页面风格一致 PHP是一种HTML内嵌式的在服务器端执行的脚本语言,所以大部分PHP开发出来的Web应用,初始的开发模板就是混合层的数据编程.虽然通过MVC设计模式可以把程序应用逻辑与网页呈现逻辑强制性分离,但也只是将应用程序的输入.处理和输出分开,网页呈现逻辑(视图)还会有HTML代