当前位置:首页 > PHP

php原生模板引擎实现

2026-02-14 04:07:18PHP

实现原生模板引擎的基本思路

原生模板引擎的核心是将模板文件中的占位符或逻辑代码替换为实际数据或执行结果。PHP本身具备混合HTML和PHP代码的能力,但原生模板引擎可以进一步简化视图层的编写。

简单变量替换引擎

创建一个基础引擎,用于替换模板中的变量占位符:

function renderTemplate($template, $data = []) {
    extract($data);
    ob_start();
    include $template;
    return ob_get_clean();
}

使用方法:

$data = ['title' => '首页', 'content' => '欢迎光临'];
echo renderTemplate('template.php', $data);

模板文件template.php内容:

<html>
<head><title><?= $title ?></title></head>
<body>
    <div><?= $content ?></div>
</body>
</html>

支持简单逻辑的引擎

扩展引擎功能,支持基本的条件判断和循环:

function render($template, $data = []) {
    extract($data);
    ob_start();
    if (file_exists($template)) {
        include $template;
    }
    return ob_get_clean();
}

模板示例:

<?php if ($loggedIn): ?>
    <p>欢迎回来,<?= $username ?></p>
<?php else: ?>
    <p>请登录</p>
<?php endif; ?>

<ul>
<?php foreach ($items as $item): ?>
    <li><?= $item ?></li>
<?php endforeach; ?>
</ul>

模板继承实现

实现类似Blade的模板继承功能:

function extend($parent) {
    global $__parent;
    $__parent = $parent;
}

function section($name) {
    global $$name;
    ob_start();
}

function endsection($name) {
    global $$name;
    $$name = ob_get_clean();
}

function renderWithExtend($template) {
    global $__parent;
    ob_start();
    include $template;
    $content = ob_get_clean();

    if ($__parent) {
        extract(get_defined_vars());
        ob_start();
        include $__parent;
        $content = ob_get_clean();
    }

    return $content;
}

使用示例: 子模板child.php:

<?php extend('parent.php'); ?>

<?php section('content'); ?>
    <h1>子模板内容</h1>
<?php endsection('content'); ?>

父模板parent.php:

<html>
<body>
    <header>网站标题</header>
    <main><?= $content ?></main>
    <footer>版权信息</footer>
</body>
</html>

缓存机制实现

添加简单的模板缓存功能:

function renderWithCache($template, $data = [], $cacheDir = 'cache') {
    $cacheFile = $cacheDir.'/'.md5($template).'.php';

    if (!file_exists($cacheDir)) {
        mkdir($cacheDir, 0755, true);
    }

    if (!file_exists($cacheFile) || filemtime($template) > filemtime($cacheFile)) {
        $content = renderTemplate($template, $data);
        file_put_contents($cacheFile, $content);
    }

    extract($data);
    include $cacheFile;
}

安全过滤处理

对输出内容进行安全过滤:

function e($value) {
    return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}

模板中使用:

php原生模板引擎实现

<p><?= e($userInput) ?></p>

这些方法展示了如何逐步构建一个功能完整的原生PHP模板引擎。实际应用中可以根据需求组合或扩展这些功能,创建更加强大和灵活的模板系统。

标签: 模板引擎
分享给朋友:

相关文章

vue实现合同模板

vue实现合同模板

Vue 实现合同模板的方法 在 Vue 中实现合同模板功能,可以通过动态数据绑定和组件化设计来实现。以下是几种常见的实现方式: 使用动态数据绑定 通过 Vue 的数据绑定特性,可以将合同模板中的变量…

div css网页制作模板

div css网页制作模板

基础HTML结构 创建HTML文件时需包含DOCTYPE声明、html、head和body标签。DOCTYPE声明确保浏览器以标准模式渲染页面,html标签是文档的根元素,head标签包含元数据和链接…

vue模板实现

vue模板实现

Vue 模板实现 Vue 模板是 Vue.js 的核心特性之一,用于声明式地将数据渲染到 DOM 中。以下是 Vue 模板的实现方式和常见用法。 基本语法 Vue 模板使用 HTML 的模板语法,可…

vue实现Word模板

vue实现Word模板

Vue 实现 Word 模板的方法 使用 docxtemplater 库 docxtemplater 是一个 JavaScript 库,可以在前端或后端生成 Word 文档。它支持模板变量替换,适合在…

vue 模板引擎 实现

vue 模板引擎 实现

Vue 模板引擎的实现原理 Vue 的模板引擎主要通过编译和渲染两个阶段将模板转换为真实的 DOM。以下是核心实现步骤: 模板编译阶段 解析模板为 AST(抽象语法树) 通过正则表达式或状态机将模板…

vue实现运费模板设置

vue实现运费模板设置

实现运费模板设置的基本思路 在Vue中实现运费模板设置功能,通常需要结合表单组件、数据绑定和动态计算。核心是设计合理的数据结构,通过v-model绑定表单数据,利用计算属性或方法实现运费计算逻辑。…