>백엔드 개발 >PHP 튜토리얼 >PHP从写简单模板引擎,供新手学习

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

WBOY
WBOY원래의
2016-06-13 12:12:19970검색

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

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

<?php /****************&#160;* @author: 一曲忧伤&#160;* @email: [email&#160;protected]&#160;* @discription: 简单模板引擎&#160;*/define(&#39;INVIEW&#39;, true);class view {&#160; &#160; var $tpl_dir = &#39;template&#39;;&#160; &#160; var $cache_dir = &#39;cache&#39;;&#160; &#160; var $tpl_ext = &#39;.html&#39;;&#160; &#160; var $var_left = &#39;{&#39;;&#160; &#160; var $var_right = &#39;}&#39;;&#160; &#160; function __construct($config=array()) {&#160; &#160; &#160; &#160; extract($config);&#160; &#160; &#160; &#160; 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(            "#$vl\s*include:(.+?)\s*$vr#i",            "#$vl\s*if\s+(.+?)\s*$vr#i",            "#$vl\s*else\s*$vr#i",            "#$vl\s*elseif\s+(.+?)\s*$vr#i",            "#$vl\s*endif\s*$vr#i",            "#$vl\s*/if\s*$vr#i",            "#$vl\s*foreach\s+(.+?):(.+?)\s*$vr#i",            "#$vl\s*endforeach\s*$vr#i",            "#$vl\s*/foreach\s*$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(&#39;\\1&#39;); ?>",            "<?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[&#39;\\2&#39;][&#39;\\3&#39;]; ?>",            "<?php echo $\\1[&#39;\\2&#39;]; ?>",            "<?php echo $\\1; ?>",            "<?php echo \\1(\\2); ?>"        );        $body = preg_replace($patterns, $replacements, $body);        file_put_contents($cache, "<?php if(!defined(&#39;INVIEW&#39;))die(&#39;YIQU&#39;); ?>".$body);    }}$view = new view();function show($tpl) {    global $view;    return $view->load($tpl);}

使用方法PHP文件:

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

使用方法HTML模板文件:

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

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

{include:子模板}

{if 条件}

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

{调用函数:参数}

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

等语法。

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


=====================国际惯例=======================

刚开始学着写一些博客,写得不好的地方请见谅,觉得还可以就赏脸赞下吧!

我的QQ群(PHP)336533596,QQ 451309839,欢迎加入。相互交流,聊天吹牛~


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.