当前位置:首页 > 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模板引擎。实际应用中可以根据需求组合或扩展这些功能,创建更加强大和灵活的模板系统。

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

相关文章

vue实现模板引擎

vue实现模板引擎

Vue 模板引擎实现原理 Vue 的模板引擎通过将模板编译成渲染函数来实现动态渲染。核心流程分为模板解析、优化和代码生成三个阶段。 模板解析阶段 Vue 使用正则表达式将模板字符串解析为抽象语法树(…

实现js引擎

实现js引擎

实现 JavaScript 引擎的基本思路 JavaScript 引擎的核心功能是将 JavaScript 代码转换为可执行的机器码或字节码。现代引擎通常包含解析、编译、优化和执行等多个阶段。 解析…

java 公式引擎如何

java 公式引擎如何

Java 公式引擎实现方法 使用内置表达式解析 Java可以通过ScriptEngine接口(如javax.script包)实现基础公式计算。以下示例使用JavaScript引擎解析数学表达式: i…

uniapp模板库

uniapp模板库

uniapp模板库推荐 uniapp提供了丰富的模板库,可以帮助开发者快速搭建项目。以下是一些常用的模板库和资源: 官方模板 DCloud插件市场:提供大量官方和第三方开发的uniapp模板,涵盖…

uniapp模板建站

uniapp模板建站

uniapp模板建站的优势 uniapp基于Vue.js框架,支持多端发布(H5、小程序、App等),开发效率高且维护成本低。丰富的模板市场和插件生态,能快速搭建功能完善的站点。 选择合适的unia…

uniapp用什么引擎

uniapp用什么引擎

Uniapp 使用的引擎 Uniapp 的核心引擎主要基于以下技术栈: Vue.js 框架 Uniapp 采用 Vue.js 作为前端开发框架,开发者可以使用 Vue 的语法(如模板、组件、响应…