PhpView:一个以PHP语言为模板语言的模板类
作者:谢声涛 shishengsoft@gmail.com
Smarty用来实现代码与界面的分离,确实是一种不错的选择。但是Smarty有自创的一套语法,
使用起来感觉很麻烦,于是想到用PHP语言实现一个精简的模板类,名字就叫PhpView。
其实,最简单的模板机制就是在PHP脚本文件中include一个模板文件。但是这样缺点比较多。
一、使用示例
<?php
$t = new PhpView();
$t->templateDir = './template';
$t->cacheDir = './cache';
$t->serializeDir = './serialize';
$t->assign('title', $title);
$t->assign('hello', $hello);
$t->display("example.html");
?>
如上所示,和Smarty的接口很相似,好像现在一些PHP模板类都是大同小异的。
二、实现代码
文件名:PhpView.class.php
<?php
/*******************************************************************************
* 简介:
* 1、模板语言使用PHP语言,而其它模板类使用自定义的专用语言,需要进行正则替换。
* 2、支持缓存机制,模板数据变化,就刷新缓存文件。
* 3、可以设定缓存时间,缓存过期,就刷新缓存文件。
* 4、支持配置文件方式初始化设定目录,也可以后期更改目录,更加灵活(也许是多余)。
********************************************************************************/
/**
* PHP视图模板类
* @class PhpView
* @author xie sheng tao <xie.s.t@163.com>
*/
class PhpView
{
/**
* 是否使用缓存机制进行工作
* @var boolean $cacheEnable true-启用缓存机制;false-关闭缓存机制
*/
public $cacheEnable = true;
/**
* 缓存时间
* 超过缓存时间则自动更新缓存。
* @var integer $cacheExpire 0-永远不过期;> 0 判断。< 0 ?? 或者 = 0 始终过期;> 0 判断;< 0 永远不过期
*/
public $cacheExpire = 0;
/**
* 模板文件的存贮目录
* @var string $templateDir
*/
public $templateDir = '';
/**
* 缓存文件的存贮目录
* @var string $cacheDir
*/
public $cacheDir = '';
/**
* 序列化文件的存贮目录
* @var string $serializeDir
*/
public $serializeDir = '';
/**
* 保存模板文件中使用的变量的名、值列表
* @var array $m_templateVarList
*/
private $m_templateVarList = array();
/**
* 记住系统目录是否已经检查过并且符合要求。避免以全局方式使用时重复检查。
* @var boolean $m_sysDirReady
*/
private $m_sysDirReady = false;
/**
* 当前操作使用的模板文件
* @var string $m_templateFile
*/
private $m_templateFile = '';
/**
* 类的构造函数
*/
public function __construct()
{
$this->readConfig();
}
/**
* 读取PhpView类的配置信息
*/
public function readConfig()
{
if(file_exists("config.php"))
{
include_once("config.php");
}
if(isset($g_cacheEnable))
{
$this->cacheEnable = $g_cacheEnable;
}
if(isset($g_templateDir))
{
$this->templateDir =$g_templateDir;
}
if(isset($g_cacheDir))
{
$this->cacheDir = $g_cacheDir;
}
if(isset($g_serializeDir))
{
$this->serializeDir = $g_serializeDir;
}
if(isset($g_sysDirReady))
{
$this->m_sysDirReady = $g_sysDirReady;
}
}
/**
* 检测所需目录是否存在。如果不存在,则报错并退出。
* 所需目录为:模板文件目录、缓存文件目录、序列化文件目录
*/
public function checkSysDir()
{
if($this->templateDir == '')
{
die("模板文件目录未设置。");
}
if(!is_readable($this->templateDir))
{
die("模板文件目录不可读。");
}
if($this->cacheDir == '')
{
die("缓存文件目录未设置。");
}
if(!(is_readable($this->cacheDir) && is_writable($this->cacheDir)))
{
die("缓存文件目录不可读写。");
}
if($this->serializeDir == '')
{
die("序列化文件目录未设置。");
}
if(!(is_readable($this->serializeDir) && is_writable($this->serializeDir)))
{
die("序列化文件目录不可读写。");
}
$this->m_sysDirReady = true;
return;
}
/**
* 指派模板文件中使用的变量
* @param string $varName 在模板中使用的变量名
* @param any &$varValue PHP中支持的数据类型
* or
* @param array $varName 使用数组来传递名值列表,即变量名作为关联索引,变量值为元素值。
*/
public function assign($varName, $varValue = null)
{
if(func_num_args() == 1)
{
$varList = func_get_arg(0);
if(gettype($varList) == 'array')
{
foreach($varList as $name=>$value)
{
$this->m_templateVarList[$name] = $value;
}
}
}
else if(gettype($varName) == 'string')
{
$this->m_templateVarList[$varName] = $varValue;
}
return;
}
/**
* 调用模板文件,生成模板中的变量,输出到浏览器
* @param string $file 模板文件名
*/
public function display($file)
{
if(!$this->m_sysDirReady)
{
$this->checkSysDir();
}
$this->m_templateFile = $file;
if($this->cacheEnable)
{
$this->cacheOutput();
}
else
{
$this->directOutput();
}
return;
}
/**
* 使用缓存机制处理模板
* 实现原理:
* 1、取得客户端请求的链接url。缓存文件和序列化文件的文件名使用此url命名。
* 2、将存贮当前模板变量的数组序列化为一个字符串。
* 3、读取模板文件对应的序列化文件,得到前一个模板变量数组的序列化字符串。
* 4、判断前后两次序列化字符串是否相等。如果相等,则直接把缓存文件的内容输出到浏览器。
* 否则,重新生成序列化文件和缓存文件,然后把模板处理结果输出到浏览器。
*/
private function cacheOutput()
{
$html = '';
$cache_filename = @urlencode(basename(SERVER['REQUEST_URI']));
$cur_serialize = @serialize($this->m_templateVarList);
$pre_serialize = $this->readSerialize($cache_filename);
if($cur_serialize === $pre_serialize)
{
if(!$this->isCacheFileTimeout($cache_filename)){
if($html = $this->readCacheFile($cache_filename))
{
echo '使用缓存文件.';
echo $html;
return;
}
}
echo '缓存文件过期.';
}
echo '刷新缓存文件.';
$this->saveSerialize($cache_filename, $cur_serialize);
/*foreach($this->m_templateVarList as $name => $value)
{
eval("/$name = /$value;"); // 通过 eval 函数生成模板文件中使用的变量
}*/
extract($this->m_templateVarList);
ob_start();
@include($this->templateDir . '/' . $this->m_templateFile);
//sleep(5);
$html = ob_get_contents();
ob_clean();
$this->writeCacheFile($cache_filename, $html);
echo $html;
return;
}
/**
* 直接将模板处理结果输出到浏览器,不使用缓存机制
*/
private function directOutput()
{
foreach($this->m_templateVarList as $name => $value)
{
eval("/$name = /$value;"); // 通过 eval 函数生成模板文件中使用的变量
}
ob_start();
@include($this->templateDir . '/' . $this->m_templateFile);
ob_flush();
return;
}
/**
* 将模板处理结果写入缓存文件
* @param string $file 缓存文件路径
* @param string $content 缓存内容
* @return null
*/
private function writeCacheFile($file, $content)
{
$filename = $this->cacheDir . '/' . $file;
@file_put_contents($filename, $content);
return;
}
/**
* 读取缓存文件
* @param string $file 缓存文件路径
* @return string 缓存文件的内容
*/
private function readCacheFile($file)
{
$filename = $this->cacheDir . '/' . $file;
$html = @file_get_contents($filename);
return $html;
}
/**
* 保存序列化字符串到文本文件中
* @param string $file 序列化文件路径
* @param string $content 序列化数据的字符串
* @return null
*/
private function saveSerialize($file, $content)
{
$filename = $this->serializeDir . '/' . $file;
@file_put_contents($filename, $content);
return;
}
/**
* 读取文本文件中存贮的序列化字符串
* @param string $file 序列化文件路径
* @return string 序列化数据的字符串
*/
private function readSerialize($file)
{
$filename = $this->serializeDir . '/' . $file;
$content = @file_get_contents($filename);
return $content;
}
/**
* 判断缓存文件是否过期
* @param string $file 缓存文件
* @return boolean
*/
private function isCacheFileTimeout($file)
{
if($this->cacheExpire == 0)//缓存时间为0,表示永远不过期
{
return false;
}
$cacheFile = $this->cacheDir . '/' . $file;
if(file_exists($cacheFile))
{
$modifyTime = filemtime($cacheFile);
$currentTime = time();
if(($currentTime - $modifyTime) > $this->cacheExpire){
return true;
}
return false;
}
return true;
}
} // end class
?>
PhpView:一个以PHP语言为模板语言的模板类
最新推荐文章于 2024-05-26 09:36:55 发布