当前位置:首页 > 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>

支持简单逻辑的引擎

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

php原生模板引擎实现

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原生模板引擎实现

<?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');
}

模板中使用:

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

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

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

相关文章

div css网页制作模板

div css网页制作模板

div css网页制作模板 使用DIV和CSS制作网页模板是前端开发的基础,以下是一些常见的方法和示例代码: 基本结构 一个典型的DIV+CSS网页模板包含头部、主体内容和页脚: <!D…

vue实现合同模板

vue实现合同模板

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

vue模板实现

vue模板实现

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

jquery实现vue模板

jquery实现vue模板

jQuery 实现类似 Vue 模板功能 在传统 jQuery 项目中模拟 Vue 的模板和数据绑定功能,可以通过以下方式实现: 数据绑定与模板渲染 使用 jQuery 的 .html() 或 .…

vue 模板引擎 实现

vue 模板引擎 实现

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

vue如何实现公用模板

vue如何实现公用模板

实现公用模板的方法 在Vue中实现公用模板可以通过组件化、插槽(slot)、混入(mixins)或高阶组件等方式实现。以下是几种常见的方法: 使用组件化 创建一个可复用的组件,将公用部分封装在该组件…