php 编写一个简单的模板引擎

php web开发中广泛采取mvc的设计模式,controller传递给view层的数据,必须通过模板引擎才能解析出来。实现一个简单的仅仅包含if,foreach标签,解析$foo变量的模板引擎。
编写template模板类和compiler编译类。代码如下:

<?php

namespace foo\base;
use foo\base\Object;
use foo\base\Compiler;
/**
* 
*/
class Template extends Object
{
   
    private $_config = [
        'suffix' => '.php',//文件后缀名
        'templateDir' => '../views/',//模板所在文件夹
        'compileDir' => '../runtime/cache/views/',//编译后存放的目录
        'suffixCompile' => '.php',//编译后文件后缀
        'isReCacheHtml' => false,//是否需要重新编译成静态html文件
        'isSupportPhp' => true,//是否支持php的语法
        'cacheTime' => 0,//缓存时间,单位秒
    ];
    private $_file;//带编译模板文件
    private $_valueMap = [];//键值对
    private $_compiler;//编译器

    public function __construct($compiler, $config = [])
    {
   
        $this->_compiler = $compiler;
        $this->_config = array_merge($this->_config, $config);
    }

    /**
     * [assign 存储控制器分配的键值]
     * @param  [type] $values [键值对集合]
     * @return [type]         [description]
     */
    public function assign($values)
    {
   
        if (is_array($values)) {
            $this->_valueMap = $values;
        } else {
            throw new \Exception('控制器分配给视图的值必须为数组!');
        }
        return $this;
    }

    /**
     * [show 展现视图]
     * @param  [type] $file [带编译缓存的文件]
     * @return [type]       [description]
     */
    public function show($file)
    {
   
        $this->_file = $file;
        if (!is_file($this->path())) {
            throw new \Exception('模板文件'. $file . '不存在!');
        }

        $compileFile = $this->_config['compileDir'] . md5($file) . $this->_config['suffixCompile'];
        $cacheFile = $this->_config['compileDir'] . md5($file) . '.html';

        //编译后文件不存在或者缓存时间已到期,重新编译,重新生成html静态缓存
        if (!is_file($compileFile) || $this->isRecompile(
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值