tpl模板引擎和使用

tpl.php

<?php
namespace tpl;
/**
 * Class Tpl
 */
class Tpl
{
    protected $view_dir;//模板文件
    protected $cache_dir;//缓存文件
    protected $lifetime;//过期时间
    protected $vars = [];//存放显示变量的数组

    /**
     * Tpl constructor.
     * @param string $view_dir
     * @param string $cache_dir
     * @param string $lifetime
     */
    public function __construct($view_dir='', $cache_dir='', $lifetime='')
    {
        //如果模板文件不为空,则设置,为空则为默认值
        if (!empty($view_dir)) {
            if ($this->check_dir($view_dir)) {
                $this->view_dir = $view_dir;
            }
        }
        //如果缓存文件不为空,则设置,为空时为默认值
        if (!empty($cache_dir)) {
            if ($this->check_dir($cache_dir)) {
                $this->cache_dir = $cache_dir;
            }
        }
        //如果过期时间不为空,则设置,为空时为默认值
        if (!empty($lifetime)) {
            $this->lifetime = $lifetime;
        }
    }

    /**
     * 对外公开的方法
     * @param string $name
     * @param string $value
     */
    public function assign($name, $value)
    {
        $this->vars[$name] = $value;//将传入的参数以键值对存入数组中
    }

    /**
     * 测试文件
     * @param $dir_path
     * @return bool
     */
    protected function check_dir($dir_path)
    {
        //如果文件不存在或不是文件夹,则创建
        if (!file_exists($dir_path) || !is_dir($dir_path)) {
            return mkdir($dir_path, 0777, true);
        }
        //如果文件不可读或不可写,则设置模式
        if (!is_writable($dir_path) || !is_readable($dir_path)) {
            return chmod($dir_path, 0777);
        }
        return true;
    }

    /**
     * 展示方法
     * @param $view_name
     * @param bool $isInclude
     * @param null $uri
     */
    public function display($view_name, $isInclude=true, $uri=null)
    {
        //通过传入的文件名,得到模板文件路径
        $view_path = rtrim($this->view_dir, '/') . '/' . $view_name;
        //判断路径是否存在
        if (!file_exists($view_path)) {
            die('文件不存在');
        }
        //通过传入的文件名得到缓存文件名
        $cache_name = md5($view_name . $uri) . '.php';
        //缓过缓存文件名得到缓存路径
        $cache_path = rtrim($this->cache_dir, '/') . '/' .$cache_name;
        //判断缓存文件是否存在,如果不存在,重新生成
        if (!file_exists($cache_path)) {
            $php = $this->compile($view_path);//解析模板文件
            file_put_contents($cache_path, $php);//缓存文件重新生成
        } else {
            //如果缓存文件存在,判断是否过期,判断模板文件是否被修改
            $is_time_out = (filectime($cache_path) + $this->lifetime) > time() ? false : true;
            $is_change = filemtime($view_path) > filemtime($cache_path) ? true : false;
            //如果缓存文件过期或模板文件被修改,重新生成缓存文件
            if ($is_time_out || $is_change) {
                $php = $this->compile($view_path);
                file_put_contents($cache_path, $php);
            }
        }
        if ($isInclude) {
            extract($this->vars);//解析传入变量的数组
            include $cache_path;//展示缓存
        }
    }

    /**
     * 正则解析模板文件
     * @param string $file_name
     * @return mixed|string
     */
    protected function compile($file_name)
    {
        $html = file_get_contents($file_name);//获取模板文件
        //正则转换数组
        $array = [
            '{$%%}' => '<?=$\1?>',
            '{foreach %%}' => '<?php foreach (\1): ?>',
            '{/foreach}' => '<?php endforeach ?>',
            '{include %%}' => '',
            '{if %%}' => '<?php if (\1): ?>',
            '{/if}' => '<?php endif ?>',
            '{for %%}' => '<?php for (\1): ?>',
            '{/for}' => '<?php endfor ?>',
            '{switch %%}' => '<?php switch (\1) ?>',
            '{/switch}' => '<?php endswitch ?>'
        ];
        //遍历数组,生成正则表达式
        foreach ($array AS $key=>$value) {
            //正则表达式,
            $pattern = '#' . str_replace('%%', '(.+?)' , preg_quote($key, '#')) . '#';
            if (strstr($pattern, 'include')) {
                $html = preg_replace_callback($pattern, [$this, 'parseInclude'], $html);
            } else {
                $html = preg_replace($pattern, $value, $html);
            }
        }
        return $html;
    }

    /**
     * 处理include表达式
     * @param array $data
     * @return string
     */
    protected function parseInclude($data)
    {
        $file_name = trim($data[1], '\'"');
        $this->display($file_name, false);
        $cache_name = md5($file_name) . '.php';
        $cache_path = rtrim($this->cache_dir, '/') . '/' . $cache_name;
        return '<?php include "'.$cache_path.'" ?>';
    }
}

user_tpl,,,,从数据库中取值,作为参数传到模板文件,再解析模板文件
<?php
include './sql/pdo.sql.php';
include 'tpl.php';

$tpl = new tpl\Tpl('./view/', './cache/', 3000);
$link = new pdo_sql();
$dat = ['menu_name', 'menu_url'];
$res = $link->table('blog_menu')->field($dat)->order('id ASC')->select();
$tpl->assign('menu', $res);
$tpl->display('index.html');

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值