{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>
<p><span>立即学习</span>“<a href="https://pan.quark.cn/s/7fc7563c4182" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">PHP免费学习笔记(深入)</a>”;</p><p class="aritcle_card flexRow">
<p class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/gongju/2229" title="PHP 8.5.5"><img
src="https://img.php.cn/upload/manual/001/246/273/6a03d2f895963707.jpeg" alt="PHP 8.5.5" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<p class="aritcle_card_info flexColumn">
<a href="/xiazai/gongju/2229" title="PHP 8.5.5">PHP 8.5.5</a>
<p>PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。</p>
</p>
<a href="/xiazai/gongju/2229" title="PHP 8.5.5" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</p>
</p>{/block}{block name="script"}{/block}
只有这样,子模板通过 {extend} 继承后,才能用同名 {block} 精准替换或追加。
正确复用公共结构的方式
导航栏、页脚这类内容稳定、仅局部微调的模块,推荐两种安全做法:
- 每个模板(父模板和子模板)各自
{include}同一份文件,避免依赖继承 - 若需定制,让公共片段自身支持
{block},再让布局模板继承它(例如:header.html → layout.html → 子模板),形成明确的、单向的继承层级
混用 {include} 和 {extend} 去“动态组装”可继承结构,只会导致行为不可控、调试困难。
文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/xinjizixun/124056.html