news 2026/6/9 14:58:54

PHP模板引擎与视图渲染

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PHP模板引擎与视图渲染

PHP模板引擎与视图渲染

PHP本身就是模板语言。但为了更好分离视图和业务逻辑,各种模板引擎应运而生。今天说说PHP模板引擎的简单实现。

一个简单的模板引擎。

```php
class SimpleTemplate
{
private string $templateDir;
private string $cacheDir;

public function __construct(string $templateDir, string $cacheDir = '/tmp/views')
{
$this->templateDir = rtrim($templateDir, '/');
$this->cacheDir = rtrim($cacheDir, '/');
if (!is_dir($this->cacheDir)) mkdir($this->cacheDir, 0755, true);
}

public function render(string $template, array $data = []): string
{
$cacheFile = $this->cacheDir . '/' . md5($template) . '.php';

if (!file_exists($cacheFile)) {
$compiled = $this->compile($template);
file_put_contents($cacheFile, $compiled);
}

extract($data);
ob_start();
include $cacheFile;
return ob_get_clean();
}

public function compile(string $template): string
{
$content = file_get_contents($this->templateDir . '/' . $template . '.html');

$content = preg_replace('/\{\{(.+?)\}\}/', '', $content);
$content = preg_replace('/@if\((.+?)\)/', '', $content);
$content = preg_replace('/@else/', '', $content);
$content = preg_replace('/@endif/', '', $content);
$content = preg_replace('/@foreach\((.+?)\)/', '', $content);
$content = preg_replace('/@endforeach/', '', $content);
$content = preg_replace('/@php\((.+?)\)/', '', $content);

return $content;
}
}
?>


{{ $name }}的个人资料

邮箱: {{ $email }}


@if(!empty($bio))

简介: {{ $bio }}


@endif

技能


  • @foreach($skills as $skill)

  • {{ $skill }}

  • @endforeach



$engine = new SimpleTemplate(__DIR__ . '/templates');
echo $engine->render('user', [
'name' => '张三',
'email' => 'test@test.com',
'bio' => 'PHP开发者',
'skills' => ['PHP', 'JavaScript', 'MySQL'],
]);
?>

模板编译缓存提升性能。把模板编译成PHP代码缓存起来,后续直接执行缓存的PHP文件,不需要重新解析模板。

```php
// 编译缓存
class TemplateCache
{
private string $cacheDir;

public function __construct(string $cacheDir = '/tmp/views_cache')
{
$this->cacheDir = rtrim($cacheDir, '/');
if (!is_dir($this->cacheDir)) mkdir($this->cacheDir, 0755, true);
}

public function load(string $template, array $data, callable $renderFn): string
{
$cacheKey = md5($template . serialize($data));
$cacheFile = $this->cacheDir . '/' . $cacheKey . '.html';

if (file_exists($cacheFile) && (time() - filemtime($cacheFile)) < 3600) {
return file_get_contents($cacheFile);
}

$content = $renderFn($data);
file_put_contents($cacheFile, $content);
return $content;
}
}
?>

模板引擎的核心是变量替换和模板继承。Blade、Twig这些成熟的模板引擎还支持布局、组件、指令等功能。自己做模板引擎主要是为了理解原理,生产环境建议用成熟的模板引擎。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 14:57:53

3步解锁终极Markdown阅读体验:告别原始文本时代

3步解锁终极Markdown阅读体验&#xff1a;告别原始文本时代 【免费下载链接】markdownReader markdownReader is a extention for chrome, used for reading markdown file. 项目地址: https://gitcode.com/gh_mirrors/ma/markdownReader 你是否厌倦了在浏览器中查看Mar…

作者头像 李华
网站建设 2026/6/9 14:53:52

3个关键决策:如何为你的量化交易项目选择最佳数据源工具

3个关键决策&#xff1a;如何为你的量化交易项目选择最佳数据源工具 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 在构建量化交易系统的过程中&#xff0c;数据源的选择往往决定了整个项目的成败…

作者头像 李华
网站建设 2026/6/9 14:51:47

什么是MTT?技术转移专业硕士和普通MBA、工科硕士有什么区别

「想转科技成果转化&#xff0c;到底读MTT、MBA还是再读个工科硕士&#xff1f;」——这是科创从业者最常问的问题。三个学位都能考研&#xff0c;但路径、人群和回报完全不同。 本文先把MTT&#xff08;技术转移专业硕士&#xff09;定义讲清&#xff0c;再与MBA、工科硕士做…

作者头像 李华
网站建设 2026/6/9 14:51:45

嵌入式硬件设计实战:从Kinetis K61电气规格到JTAG/ADC稳定实现

1. 项目概述与核心价值在嵌入式硬件开发领域&#xff0c;尤其是基于NXP Kinetis K61这类高性能ARM Cortex-M4微控制器的项目中&#xff0c;数据手册里那些密密麻麻的电气特性表格往往是最容易被忽视&#xff0c;却又最致命的部分。很多工程师习惯性地直接调用厂商提供的库函数&…

作者头像 李华