首页 > 编程 > PHP > 正文

PHP自写简单模板引擎 供新手学习

2020-03-22 16:23:30
字体:
来源:转载
供稿:网友
  • 今天要写点小东西,突然想到要用模板引擎。就“随手”写了一个,发上来供新手学习。搞了这么久PHP,想想也真是感慨,当年研究了几天的东西现在一两个小时就弄完了,当年一起完耍的女神现在已经不知所踪了。。。咳咳,下面是代码:

    <?php/***************** @author: 一曲忧伤* @email: 451309839@qq.com* @discription: 简单模板引擎*/define('INVIEW', true);html' target='_blank'>class view {  var $tpl_dir = 'template';  var $cache_dir = 'cache';  var $tpl_ext = '.html';  var $var_left = '{';  var $var_right = '}';  function __construct($config=array()) {    extract($config);    if(isset($tpl_dir))$this->tpl_dir = $tpl_dir;    if(isset($cache_dir))$this->cache_dir = $cache_dir;    if(isset($tpl_ext))$this->tpl_ext = $tpl_ext;    if(isset($var_left))$this->var_left = $var_left;    if(isset($var_right))$this->var_right = $var_right;  }   function load($tplfilename) {    $tplfile = $this->tpl_dir.'/'.$tplfilename.$this->tpl_ext;    if(!file_exists($tplfile))      die('Template not found: '.$tplfile);    return $this->cache($tplfilename, $tplfile);  }  //判断模板是否缓存,如模板文件有更改则重新编译  function cache($tplname, $tpl_file) {    $cache_file = $this->cache_dir.'/'.md5($tplname).'.php';    if(!file_exists($cache_file) || filemtime($tpl_file)>filemtime($cache_file))      $this->compile($tpl_file, $cache_file);    return $cache_file;  }  //编译模板内容到PHP格式,并写入缓存  function compile($tpl, $cache) {    $body = file_get_contents($tpl);    $vl = $this->var_left;    $vr = $this->var_right;    $patterns = array(      "#$vls*include:(.+?)s*$vr#i",      "#$vls*ifs+(.+?)s*$vr#i",      "#$vls*elses*$vr#i",      "#$vls*elseifs+(.+?)s*$vr#i",      "#$vls*endifs*$vr#i",      "#$vls*/ifs*$vr#i",      "#$vls*foreachs+(.+?):(.+?)s*$vr#i",      "#$vls*endforeachs*$vr#i",      "#$vls*/foreachs*$vr#i",      "#$vl([0-9a-zA-Z_]+?).([0-9a-zA-Z_]+?).([0-9a-zA-Z_]+?)$vr#i",      "#$vl([0-9a-zA-Z_]+?).([0-9a-zA-Z_]+?)$vr#i",      "#$vl([0-9a-zA-Z_[]'"]+?)$vr#i",      "#$vl([0-9a-zA-Z_]+?):(.*?)$vr#i"    );    $replacements = array(      "<?php include show('/1'); ?>",      "<?php if(/1): ?>",      "<?php else: ?>",      "<?php elseif(/1): ?>",      "<?php endif; ?>",      "<?php endif; ?>",      "<?php if(count($/1)>0):$autoindex=0;foreach($/1 as /2):$autoindex++; ?>",      "<?php endforeach;endif; ?>",      "<?php endforeach;endif; ?>",      "<?php echo $/1['/2']['/3']; ?>",      "<?php echo $/1['/2']; ?>",      "<?php echo $/1; ?>",      "<?php echo /1(/2); ?>"    );    $body = preg_replace($patterns, $replacements, $body);    file_put_contents($cache, "<?php if(!defined('INVIEW'))die('YIQU'); ?>".$body);  }}$view = new view();function show($tpl) {  global $view;  return $view->load($tpl);}

    使用方法PHP文件:

    <?phpinclude 'view.php';$title = '文档标题';$a=array('a'=>'rows','b'=>array('c'=>'inarray')); include show('index');

    使用方法HTML模板文件:

    <html><head><title>{title}</title><meta http-equiv="Content-Type" content="text/html;charset=utf-8"/></head><body>你好,仅供参考<br/>{a.a}{a.b.c}<br/>{foreach a:$v}{autoindex}.{v}<br/>{/foreach}</body></html>{include:footer}

    模板文件放在template目录,缓存放在cahce目录,这两个目录都要手动创建,缓存加上判断不可直接访问。可以使用

    {include:子模板}

    {if 条件}

    {foreach 变量:as语句},$autoindex为自增变量

    {调用函数:参数}

    {变量},包含数组变量简化写法(最多只支持三维数组)

    等语法。

    好了,整个模板引擎实现比较简单,因为一直比较喜欢这种include方式的模板,只供新手学习原理就好了。

    PHP编程

    郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

  • 发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表