{block}是完全替换而非填空,子模板同名block会彻底覆盖父模板内容;{extend}必须顶格写于子模板首行,路径、大小写、后缀(tp6+需显式)及父模板{block}声明均须严格匹配,否则静默失效。

ThinkPHP 的 {block} 不是“填空”,而是“覆盖”——写错名称、漏掉 {__BLOCK__}、路径不对,页面就直接变空白,且不报错。
{extend name="xxx"} 必须严格首行无缩进
模板引擎只在子模板第一行扫描 {extend},一旦前面有空格、空行、PHP 注释(如 <?php // 注释 ?>),整个继承逻辑就被跳过,渲染结果就是子模板原样输出,布局完全不生效。
-
{extend}必须顶格写,不能有任何前置字符; - name 值不带后缀,
view/public/base.html对应{extend name="public/base"}; - TP6+ 部分模板驱动要求显式写后缀,如
{extend name="public/base.html"},旧写法可能失效; - 大小写敏感:
content≠Content,配对失败时子模板的{block}被静默忽略。
{block name="xxx"} 是完全替换,不是追加
父模板中 {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="content"}新内容{/block},那默认内容就彻底消失——这是设计行为,不是 bug。
- 想保留父内容并追加,必须在父模板中用
{__BLOCK__}显式留位,例如:{block name="script"}{__BLOCK__}<script>loadMore();</script>{/block}; - 子模板里重复定义同一
name的{block},仅最后一个生效; - 父模板没声明
{block name="xxx"},子模板写了也无效,且无任何提示。
layout_on 配置对 return $this->fetch() 无效
很多人在 config/template.php 里设了 'layout_on'=>true,却发现控制器里 return $this->fetch('index'); 根本不套布局——因为该配置只影响底层 fetch() 调用,不触发视图层的布局逻辑。
- 正确做法:在控制器中显式调用
$this->view->engine->layout('layout');; - 或改用
{layout name="layout" /}模板标签(ThinkPHP 5+ 支持),写在子模板顶部; - 全局启用 layout 后,个别页面想禁用,需在子模板首行写
{__NOLAYOUT__}。
{include} 和 {extend} 别混着乱用
{include} 是文件包含,{extend} 是模板继承,二者执行阶段不同、作用域隔离。混用不当会导致区块无法覆盖、静态资源重复加载、变量作用域丢失。
-
{include file="public/header" title="首页" user_name=$user.name}才能传参,父模板变量默认不透传; -
{include}路径必须是模板目录下相对路径,./header或header.html会 404; - 若布局文件里已用
{block name="header"},就别再{include}同一区域——区块优先级高于 include,容易造成结构断裂。
最常被忽略的点:查看最终 HTML 源码。如果开头就是子模板内容,没出现布局里的 header 或 footer,说明 {extend} 根本没跑起来——这时别查语法,先检查首行、路径、大小写、父模板是否存在同名 block。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










