本文目录导读:

PHP原生模板指的是直接用PHP本身作为模板引擎(不使用Twig、Blade等第三方模板库),以下是几种常见的使用方式:
基础PHP模板(最常用)
分离HTML和PHP逻辑
模板文件 template.php:
<?php
// 接收变量(在模板顶部定义)
$title = $title ?? '默认标题';
$content = $content ?? '';
?>
<!DOCTYPE html>
<html>
<head><?php echo htmlspecialchars($title); ?></title>
</head>
<body>
<h1><?php echo htmlspecialchars($title); ?></h1>
<div class="content">
<?php echo $content; ?>
</div>
</body>
</html>
调用模板:
<?php
// 准备数据
$data = [ => '我的页面',
'content' => '<p>这是内容</p>'
];
// 加载模板(推荐使用 extract)
extract($data);
include 'template.php';
?>
使用函数封装模板
<?php
function render_template($template, $data = []) {
// 开启输出缓冲
ob_start();
// 提取变量到当前作用域
extract($data);
// 包含模板文件
include $template . '.php';
// 获取缓冲区内容并清理
return ob_get_clean();
}
// 使用
$html = render_template('template', [ => '我的标题',
'items' => ['苹果', '香蕉', '橙子']
]);
echo $html;
?>
模板循环与条件判断
模板文件 list_template.php:
<?php
$items = $items ?? [];
$showEmpty = empty($items) ? ' style="display:none"' : '';
?>
<div class="list">
<?php if (empty($items)): ?>
<p>暂无数据</p>
<?php else: ?>
<ul>
<?php foreach ($items as $item): ?>
<li><?php echo htmlspecialchars($item); ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</div>
模板继承(简单实现)
<?php
// 布局文件 layout.php
function layout($content, $title = '') {
return <<<HTML
<!DOCTYPE html>
<html>
<head>{$title}</title>
</head>
<body>
<header>网站头部</header>
<main>{$content}</main>
<footer>网站底部</footer>
</body>
</html>
HTML;
}
// 页面文件
$pageContent = '<h1>页面内容</h1><p>正文...</p>';
echo layout($pageContent, '我的页面');
?>
使用 include/require 进行模块化
<?php
// header.php
function header_template() {
?>
<header>
<nav>
<ul>
<li><a href="/">首页</a></li>
<li><a href="/about">lt;/a></li>
</ul>
</nav>
</header>
<?php
}
?>
<?php
// page.php
include 'header.php';
header_template();
?>
<main>
<h1>主内容</h1>
</main>
<?php include 'footer.php'; ?>
安全注意事项
<?php
// 转义输出
function e($string) {
return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}
// 使用
echo e($userInput); // 而不是直接 echo $userInput
?>
完整示例:简单博客模板
<?php
// blog_template.php
function render_blog($posts, $options = []) {
ob_start();
?>
<div class="blog-posts">
<?php foreach ($posts as $post): ?>
<article class="post">
<h2>
<a href="/post/<?php echo $post['slug']; ?>">
<?php echo e($post['title']); ?>
</a>
</h2>
<div class="meta">
<span>作者: <?php echo e($post['author']); ?></span>
<span>日期: <?php echo date('Y-m-d', strtotime($post['date'])); ?></span>
</div>
<div class="excerpt">
<?php echo nl2br(e($post['excerpt'])); ?>
</div>
<a href="/post/<?php echo $post['slug']; ?>" class="read-more">阅读更多</a>
</article>
<?php endforeach; ?>
</div>
<?php
return ob_get_clean();
}
// 使用
$posts = [
['slug' => 'hello-world', 'title' => 'Hello World', 'author' => '张三', 'date' => '2023-01-01', 'excerpt' => '这是我第一篇博客'],
['slug' => 'php-tips', 'title' => 'PHP Tips', 'author' => '李四', 'date' => '2023-01-02', 'excerpt' => '一些PHP技巧']
];
echo render_blog($posts);
?>
优点和缺点
优点:
- 不需要额外学习,直接使用PHP语法
- 性能好,无额外解析开销
- 灵活性高,可随意控制
缺点:
- 逻辑与表现分离不够彻底
- 缺少模板继承、部件等高级特性
- 模板中容易混入业务逻辑
最佳实践建议
- 严格分离:模板中只做展示,不做业务计算
- 始终转义:使用
e()函数或htmlspecialchars()进行输出转义 - 使用约定:统一变量命名和文件结构
- 缓存优化:对复杂模板结果进行缓存
对于项目较大的情况,建议使用成熟的模板引擎如 Twig 或 Blade,但如果只是简单页面或想要零依赖,原生PHP模板完全够用。