当前位置:Gxlcms > PHP教程 > 一个简单的模板类--编译型的(simplet类增强后)

一个简单的模板类--编译型的(simplet类增强后)

时间:2021-07-01 10:21:17 帮助过:34人阅读

在上次发布的simplet类之后(http://bbs.phpchina.com/thread-85257-1-1.html),发现有很多缺陷,例如不支持多维数组,注释和没有缓存功能,这次我把这些功能都加进去了!!!
大家有兴趣的话,我下次出个教程,来谈谈我写这个类的一些思想和方法!!!支持的话可以跟贴支持我!
PHP代码:
simplet.class.php
class 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,})%>/","", $content);
      $content = preg_replace("/<%([\$a-zA-Z0-9_]{1,})\.loop%>/", " \\$$1_val) { ?>",$content);
      $content = preg_replace("/<%([\$a-zA-Z0-9_]{1,})\.loop\(([\$a-zA-Z0-9_]{1,})\)%>/", "", $content);
      $content = preg_replace("/<%([\$a-zA-Z0-9_]{1,})\.loop\(([\$a-zA-Z0-9_]{1,}),([\$a-zA-Z0-9_]{1,})\)%>/", " \\$$3) { ?>", $content);
      $content = preg_replace("/<%([\$a-zA-Z0-9_]{1,})\.key%>/", "", $content);
      $content = preg_replace("/<%([\$a-zA-Z0-9_]{1,})\.value%>/", "", $content);
      $content = preg_replace("/<%([\$a-zA-Z0-9_]{1,})\\?%>/", "", $content);
      $content = preg_replace("/<%end%>/","", $content);
      $content = preg_replace("/<%##common##%>([^<%##end##%>]{0,})<%##end##%>/", "", $content);
      if (preg_match_all("/<%{([^(}%>)]{1,})}%>/", $content, $files)) {
        $this->comp($this->templates_dir . $files[1][0]);
      }
      $content = preg_replace("/<%{([^(}%>)]{1,})}%>/", "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

require_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?%>
 

Condition is true


<%end%>

<%##common##%>
下面是包含文件()
<%##end##%>
<%{filename.php}%>

人气教程排行