{include}引入的公共片段脱离继承体系,其内部{block}对子模板不可见;需定制的内容必须定义在布局模板中并用{block}包裹,子模板通过{extend}继承后方可覆盖。

因为 {include} 和 {extend} 的执行时机完全不同,公共片段一旦用 {include} 引入,就脱离了继承体系的控制范围。
公共片段不参与继承链
在父模板中写 {include file="common/header" /},只是运行时把 header.html 的内容原样插入进来。此时模板引擎已完成编译期处理(包括 {extend} 注入、{block} 替换),header.html 里的任何 {block} 对子模板完全不可见——子模板无法覆盖它,也无法向其中注入内容。
- header.html 中的
{block name="logo"}不会被识别为可继承区块 - 子模板里同名
{block name="logo"}会被直接忽略(无报错) - 最终渲染结果是 header.html 原始内容 + 子模板其他
{block}替换结果,两者互不影响
真正需要定制的部分必须进布局模板
想让标题、JS 加载位置、页面主体等可被子模板控制,这些区域必须直接定义在基础布局模板(如 layout.html)里,并用 {block} 包裹:
{block name="title"}首页{/block}{block name="content"}<p>默认内容</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站"><img src="https://img.php.cn/upload/skill/000/000/081/179040786932301.jpg" alt="btpanel phpsite 宝塔面板PHP网站" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站" class="overflowclass">btpanel phpsite 宝塔面板PHP网站</a> <p class="overflowclass">宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理</p> </div> <a rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>{/block}{block name="script"}{/block}
只有这样,子模板通过 {extend} 继承后,才能用同名 {block} 精准替换或追加。
正确复用公共结构的方式
导航栏、页脚这类内容稳定、仅局部微调的模块,推荐两种安全做法:
- 每个模板(父模板和子模板)各自
{include}同一份文件,避免依赖继承 - 若需定制,让公共片段自身支持
{block},再让布局模板继承它(例如:header.html → layout.html → 子模板),形成明确的、单向的继承层级
混用 {include} 和 {extend} 去“动态组装”可继承结构,只会导致行为不可控、调试困难。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










