PHP 实现自己的模板引擎(二)——一个简单的例子

全栈 shanhuhai 9686℃ 0评论

上一篇,我们讲了模板引擎的作用,以及做了一些准备工作,好了,现在来开始实现一个简单的模板引擎。

首先看一个简单的demo,我通过三个文件实现了一个简单的模板引擎的例子

目录结构如下:

view.php是主要的模板引擎类,
demo.php 是入口文件,
tpl 目录是模板目录
里面有一个模板文件content.php,
下面是三个文件的源代码, 运行php demo.php 可以看到结果,
代码中有详细的注释,请自行阅读,我感觉代码太简单,没啥好讲的,如果有问题请在评论区留言。

view.php内容

class View
{
    /**
     * @var array 默认配置
     */
    protected $config = [
        'tplPath' => 'app/view',
    ];

    /**
     * @var array 要注入到模板中的数据
     */
    protected $data = [];

    /**
     * 模板类的构造函数,接收一个配置数组
     * View constructor.
     * @param array $config
     */
    public function __construct(array $config) {
        $this->config = array_merge($this->config, $config);
    }

    /**
     * 添加要注入到模板中的数据
     * @param array $data 要注入的数据
     */
    public function assign(array $data) {
        $this->data = array_merge($this->data, $data) ;
    }

    /**
     * 渲染模板
     * @param string $tpl 模板位置
     * @param array $data 要注入的数据
     */
    public function display($tpl, array $data = []) {
        $this->assign($data);

        //注入变量
        extract($this->data);

        //引入模板
        $tpl =  $this->getTpl($tpl);
        if(!file_exists($tpl)) {
            throw new \UnexpectedValueException("视图{$tpl}不存在");
        }
        include $tpl;
    }

    /**
     * 获取模板路径
     * @param $tpl
     * @return string
     */
    private function getTpl($tpl) {
        return $this->config['tplPath'].'/'.$tpl.'.php';
    }
}

demo.php内容


<?php require 'view.php'; $title = "实现一个模板类"; $date = date('Y-m-d H:i:s', time()); $tags = ['PHP','教程','模板']; //假设你的模板都在当前tpl 目录下 $view = new View(['tplPath'=>'tpl']); //content 是模板名, $view->display('content', [ 'title'=>$title, 'date'=> $date, 'tags'=> $tags, ]);

我们在 tpl 目录中创建视图文件 content.php, 内容为

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <h1>  标题:   <?php echo $title ?> </h1>
    <span>发布时间:<?php echo $date; ?> </span>
    标签:
    <ul>
        <?php foreach ($tags as $key => $value): ?>
        <li><?php echo $value; ?></li>
        <?php endforeach; ?>
    </ul>
</body>
</html>

稍微讲解一下,模板引擎核心的地方就在于下面两行代码,

  //注入变量
   extract($data);
   //引入模板
   $tpl =  $this->getTpl($tpl);

通过首先我们通过 extract 函数将要注入到模板中的变量提取到当前作用域,然后将模板文件 require 进来,这样就我们就可以在模板上直接调用我们要注入到模板中的数据了。这个地方很关键,就几乎就是PHP模板引擎的核心所在。下一节我们将会实现只编译模板而不用把内容输出到浏览器。

转载请注明:大后端 » PHP 实现自己的模板引擎(二)——一个简单的例子

喜欢 (2)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址