PHP项目模板布局如何继承复用

wen PHP项目 26

本文目录导读:

PHP项目模板布局如何继承复用

  1. 方案一:原生PHP + 函数实现(轻量级,无需依赖)
  2. 方案二:使用专业模板引擎(推荐:Twig / Blade)
  3. 方案三:使用 Smarty(经典但较老)
  4. 如何选择?建议方案
  5. 额外建议:保持代码分离

在PHP项目中,模板布局继承复用主要有以下几种常见方案,最推荐的是使用 原生PHP 结合简单的函数实现,或者使用 专业的模板引擎(如Twig、Blade)。

以下是几种主流实现方式:


原生PHP + 函数实现(轻量级,无需依赖)

这是最基础且性能最高的方式,适合简单的项目或不想引入额外依赖的情况。

核心思路: 定义 layout() 函数作为布局容器,使用 require 引入子模板。

定义布局文件(layout.php

<?php
// layout.php - 主布局文件
function layout($title = '默认标题', $contentCallback) {
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8"><?= htmlspecialchars($title) ?></title>
</head>
<body>
    <header>
        <h1>网站通用头部</h1>
    </header>
    <main>
        <?php
        // 执行传入的回调函数,输出子模板内容
        if (is_callable($contentCallback)) {
            $contentCallback();
        }
        ?>
    </main>
    <footer>
        <p>网站通用底部 © 2023</p>
    </footer>
</body>
</html>
<?php
}
?>

创建子模板(如 home.php

<?php
// home.php - 子模板文件
require_once 'layout.php';
// 调用布局函数,传入标题和内容
layout('首页', function() {
?>
    <h2>这是首页内容</h2>
    <p>欢迎来到我的网站。</p>
<?php
});
?>

输出效果: 浏览器访问 home.php 时,会渲染出包含头部、底部和中间内容的完整HTML页面。

优点: 无需引入任何外部库,纯原生PHP,性能极好。
缺点: 需要手动管理 require 和回调函数,对于复杂嵌套(如三级继承)不太方便。


使用专业模板引擎(推荐:Twig / Blade)

对于中大型项目,强烈建议使用模板引擎,它们提供了更优雅的继承语法。

使用 Twig(最流行)

安装: composer require twig/twig

布局文件(base.html.twig):

{# base.html.twig #}
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">{% block title %}默认标题{% endblock %}</title>
</head>
<body>
    <header>
        <h1>网站头部</h1>
    </header>
    <main>
        {% block content %}{% endblock %}
    </main>
    <footer>
        <p>网站底部</p>
    </footer>
</body>
</html>

子模板(home.html.twig):

{# home.html.twig #}
{% extends "base.html.twig" %}
{% block title %}首页标题{% endblock %}
{% block content %}
    <h2>首页内容</h2>
    <p>欢迎来到我的网站。</p>
{% endblock %}

特点:

  • 使用 extendsblock 关键字,语法简洁。
  • 支持多重继承(子模板可再继承)。
  • 自动HTML转义,安全性好。

使用 Blade(PHP框架 Laravel 内置)

如果你使用Laravel框架,Blade是其默认模板引擎,继承方式如下:

布局文件(layouts/app.blade.php):

<!-- layouts/app.blade.php -->
<!DOCTYPE html>
<html>
<head>@yield('title')</title>
</head>
<body>
    @include('partials.header')
    <div class="container">
        @yield('content')
    </div>
    @include('partials.footer')
</body>
</html>

子视图(home.blade.php):

@extends('layouts.app')
@section('title', '首页')
@section('content')
    <h2>首页内容</h2>
@endSection

特点:

  • 使用 @extends@section / @yield
  • 支持 @include 引入公共部分(如头部、底部)。
  • 支持组件和插槽。

使用 Smarty(经典但较老)

Smarty是PHP历史上非常流行的模板引擎,现在逐渐被Twig取代,但仍在使用。

布局:

{* base.tpl *}
<!DOCTYPE html>
<html>
<head>{block name=title}默认标题{/block}</title>
</head>
<body>
    {block name=content}{/block}
</body>
</html>

子模板:

{extends file="base.tpl"}
{block name=title}首页{/block}
{block name=content}
    <p>内容</p>
{/block}

如何选择?建议方案

项目情况 推荐方案
小型项目 / 性能敏感 原生PHP + 函数(方案一)
中型及以上项目 / 团队协作 Twig(方案二,最推荐)
使用 Laravel 框架 Blade(框架自带,无需选)
接手遗留系统 Smarty(如果项目已用)

额外建议:保持代码分离

无论使用哪种方案,最佳实践是将模板文件放在单独的目录(如 templates/views/),与业务逻辑文件(*.php)完全分离,这样可以:

  • 方便前端和后端工程师协作。
  • 避免模板中混入复杂的PHP逻辑。
  • 提高安全性(模板目录可设置为不可直接访问)。

选择适合你的项目规模和团队习惯的方案,模板继承就能很好地复用布局,提高开发效率。

抱歉,评论功能暂时关闭!