上一篇,我们讲了模板引擎的作用,以及做了一些准备工作,好了,现在来开始实现一个简单的模板引擎。
首先看一个简单的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 实现自己的模板引擎(二)——一个简单的例子