在上次发布的simplet类之后(http://bbs.phpchina.com/thread-85257-1-1.html),发现有很多缺陷,例如不支持多维数组,注释和没有缓存功能,这次我把这些功能都加进去了!!!大家有兴趣的话,我下次出个教程,来谈谈我写这个类的一些思想和方法!!!支持的话可以跟贴支持我!PHP代码:simplet.class.php<?phpclass SimpleT { private $t_vars; private $templates_dir; private $templates_c_dir; private $cache; private $cache_dir; public function __construct() { $this->templates_dir = './templates/'; $this->templates_c_dir = './templates_c/'; $this->cache = 0; $this->cache_dir = './cache/'; } public function setDir($dir, $type = 'template') { if(is_dir($dir)) { if($type == 'template') $this->templates_dir = rtrim($dir, '/').'/'; elseif($type == 'template_c') $this->templates_c_dir = rtrim($dir, '/').'/'; elseif($type == 'cache') $this->cache_dir = rtrim($dir, '/').'/'; else return false; return true; } else { return false; } } public function cache($time) { if(is_numeric($time)) { $this->cache = $time; return true; } else { return false; } } public function assign($var, $value = NULL) { if (is_array($var)) { foreach ($var as $key => $val) { $this->t_vars[$key] = $val; } } else { $this->t_vars[$var] = $value; } } private function comp($filename) { try { if(!$fp = fopen($filename, 'r')) { throw new Exception('Can not open ' . $filename); } $filesize = filesize($filename); if($filesize <= 0) { throw new Exception('The file size must > 0 ' ); } $content = fread($fp, $filesize); fclose($fp); unset($fp); $content = preg_replace('/<%=([$a-zA-Z0-9_]{1,})%>/','<?php echo $$1 ;?>', $content); $content = preg_replace('/<%([$a-zA-Z0-9_]{1,}).loop%>/', '<?php foreach($$1 as $$1_key => $$1_val) { ?>',$content); $content = preg_replace('/<%([$a-zA-Z0-9_]{1,}).loop(([$a-zA-Z0-9_]{1,}))%>/', '<?php foreach($$1 as $$2) { ?>', $content); $content = preg_replace('/<%([$a-zA-Z0-9_]{1,}).loop(([$a-zA-Z0-9_]{1,}),([$a-zA-Z0-9_]{1,}))%>/', '<?php foreach($$1 as $$2 => $$3) { ?>', $content); $content = preg_replace('/<%([$a-zA-Z0-9_]{1,}).key%>/', '<?php echo $$1_key ;?>', $content); $content = preg_replace('/<%([$a-zA-Z0-9_]{1,}).value%>/', '<?php echo $$1_val ;?>', $content); $content = preg_replace('/<%([$a-zA-Z0-9_]{1,})?%>/', '<?php if($$1 == true) { ?>', $content); $content = preg_replace('/<%end%>/','<?php } ?>', $content); $content = preg_replace('/<%##common##%>([^<%##end##%>]{0,})<%##end##%>/', '<?phpn/* $1 */n?>', $content); if (preg_match_all('/<%{([^(}%>)]{1,})}%>/', $content, $files)) { $this->comp($this->templates_dir . $files[1][0]); } $content = preg_replace('/<%{([^(}%>)]{1,})}%>/', '<?php include '{$this->templates_c_dir}simplet_comp_$1.php'; ?>', $content); echo $content; $fp = fopen($this->templates_c_dir . 'simplet_comp_' . basename($filename) . '.php', 'w'); if(!fwrite($fp, $content)) { throw new Exception('Can not write content in the ' . $filename); } fclose($fp); } catch (Exception $e) { echo $e->getMessage(); } return true; } public function display($filename) { $filename = $this->templates_dir . $filename; if(!file_exists($filename)) { return false; } $t_filename_c = $this->templates_c_dir . 'simplet_comp_' . basename($filename) .'.php'; if(!file_exists($t_filename_c) || filemtime($t_filename_c) < filemtime($filename)) { $this->comp($filename); } if($this->cache > 0) { $cache_file = $this->cache_dir . basename($filename); if(!file_exists($cache_file) || (time() - filemtime($cache_file)) > $this->cache) { ob_start(); foreach ($this->t_vars as $key => $val) { $$key = $val; } include($t_filename_c); $content = ob_get_contents(); ob_end_clean(); $fp = fopen($cache_file, 'w'); fwrite($fp, $content); fclose($fp); echo $content; unset($content); } else { include($cache_file); } } else { foreach ($this->t_vars as $key => $val) { $$key = $val; } include($t_filename_c); } }}?>
PHP代码:test.php
<?phprequire_once('simplet.class.php');
$t = new SimpleT();$t->cache(10);//开启cache功能,并且设置为过期时间为10秒$t->assign('arrays', array(array('hello','world')));$t->assign('condition',false);$t->display('index.php');?>
PHP代码:index.php(模板文件,放在templates/文件夹里)
<%##common##%>这里是注释下面是多维数组循环<%##end##%><%arrays.loop(value)%> <%value.loop(name)%> <%=name%> <%end%><%end%>
<%##common##%>下面是条件判断<%##end##%><%condition?%> <h1>Condition is true</h1><%end%>
<%##common##%>下面是包含文件()<%##end##%><%{filename.php}%>