当前位置:首页 > PHP

php原生模板引擎实现

2026-02-28 03:09:15PHP

PHP原生模板引擎实现

基本模板解析

使用PHP原生语法作为模板引擎的基础,通过extract()函数将变量导入当前符号表,再通过include引入模板文件。

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

变量输出与转义

在模板中直接输出变量时,应对HTML特殊字符进行转义以防止XSS攻击。

function escape($string) {
    return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}

模板中使用示例:

<?php echo escape($user_input); ?>

控制结构支持

PHP原生语法已支持条件判断和循环结构,无需额外实现。

<?php if ($condition): ?>
    <div>Content</div>
<?php endif; ?>

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

模板继承

通过include和变量传递实现简单的模板继承机制。

基础模板(layout.php):

<!DOCTYPE html>
<html>
<head>
    <title><?php echo escape($title); ?></title>
</head>
<body>
    <?php include $content; ?>
</body>
</html>

子模板(page.php):

<?php
$title = "Page Title";
$content = __FILE__;
include 'layout.php';
?>

自定义模板函数

注册自定义函数到模板中,增强模板功能。

function template_function($name, $callback) {
    if (!function_exists($name)) {
        function _tmp_func($name, $callback) {
            return function() use ($name, $callback) {
                return call_user_func_array($callback, func_get_args());
            };
        }
        $func = _tmp_func($name, $callback);
        $func();
    }
}

使用示例:

template_function('uppercase', function($str) {
    return strtoupper($str);
});

模板中调用:

<?php echo uppercase('hello'); ?>

性能优化

通过缓存已编译的模板提高性能。

php原生模板引擎实现

function cache_template($template, $data = []) {
    $cache_file = 'cache/' . md5($template) . '.php';
    if (!file_exists($cache_file) || filemtime($template) > filemtime($cache_file)) {
        $content = render($template, $data);
        file_put_contents($cache_file, $content);
    }
    return $cache_file;
}

安全注意事项

  • 始终对用户输入进行转义
  • 限制模板文件只能包含在特定目录
  • 禁用危险的PHP函数如eval()
  • 对模板文件路径进行校验,防止目录遍历攻击
function safe_include($file) {
    $allowed_dir = realpath('./templates');
    $path = realpath($file);
    if (strpos($path, $allowed_dir) === 0) {
        include $path;
    } else {
        throw new Exception("Invalid template path");
    }
}

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

相关文章

js 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与响应式…

vue实现简单视图模板

vue实现简单视图模板

Vue 实现简单视图模板 Vue.js 是一个渐进式 JavaScript 框架,适合构建用户界面。以下是一个简单的 Vue 视图模板实现方法,包含基础结构和功能。 初始化 Vue 项目 使用 Vu…

react实现模板打印

react实现模板打印

React 实现模板打印的方法 使用 react-to-print 库 安装 react-to-print 库: npm install react-to-print 创建一个可打印的组件: im…

css制作模板

css制作模板

CSS 制作模板的方法 使用 CSS 变量定义主题 通过 CSS 变量(自定义属性)定义颜色、字体、间距等主题元素,便于全局统一修改。例如: :root { --primary-color: #…

网页制作CSS模板

网页制作CSS模板

CSS模板的基本结构 CSS模板通常包含全局样式、布局、组件样式和响应式设计。以下是一个基础模板框架: /* 全局样式 */ body { margin: 0; paddin…

用css制作模板

用css制作模板

使用CSS创建模板的方法 CSS模板可以通过多种方式实现,以下是几种常见的方法: 定义基础样式 在CSS文件中设置全局样式,包括字体、颜色、间距等。例如: body { font-family…