ThinkPHP6.1模板数组输出为空,通常因值被转义、过滤或覆盖而非未传值;用{: $var}可绕过转义验证,检查assign覆盖、系统变量失效及未定义变量兜底。

ThinkPHP6.1模板输出数组数据为空,多数情况不是没传值,而是值被过滤、转义或覆盖了。关键先确认“空”是真没传,还是传了但没显示。
用{: $var}快速验证是否被转义或判空拦截
TP6默认对{$arr}做HTML转义,并对null、''、false、0等值静默跳过(不报错也不输出)。这会导致dump($arr)能看到内容,页面却空白。
- 把模板中{$data}临时改成{: $data}——它绕过所有自动处理,原样输出
- 如果{: $data}能显示(比如打印出
array(3) { ... }),说明问题出在值类型或模板引擎的默认行为上,不是赋值失败 - 若{: $data}也为空,再检查控制器是否漏掉
$this->assign('data', $arr)或变量名写错
检查assign是否被覆盖或未正确赋值
ThinkPHP的assign()是覆盖式写入,同名多次调用只保留最后一次。容易被中间件、父类控制器或钩子方法悄悄覆盖。
- 搜索控制器中所有
assign('data', ...),确认没有重复赋值且最后一次是你想传的内容 - 避免混用
$this->assign()和$this->view->assign():前者限于当前操作,后者可能跨操作残留 - 数组变量要确保是真实数组,不要误传
null或空字符串:$this->assign('data', []);才安全,$this->assign('data', '')在{$data}里就不可见
区分系统变量与手动assign变量
像{$Think.get.id}这类系统变量不依赖assign(),而是读取Request对象状态。路由重写、CLI模式或关闭模板自动注入后,它们会失效。
立即学习“PHP免费学习笔记(深入)”;
- 不要直接依赖{$Think.get.xxx}做核心逻辑,尤其在开启URL路由后
- 稳妥做法是在控制器中显式获取并assign:
$this->assign('get_id', input('get.id'));,模板用{$get_id} - 调试时可在模板开头加{: get_defined_vars()},直接查看当前已传入的所有变量
数组内容为空时的安全输出方式
即使数组存在,内部元素为空也会导致{$data.name}报Notice或不显示。模板中应主动兜底。
- 统一用default修饰符:{$data.name|default='暂无姓名'},可捕获未定义、null、空字符串等情况
- 判断数组是否为空,优先用empty过滤器:{% if $data|empty %}数据为空{% else %}{$data.name}{% endif %}
- 避免在模板中写{% if isset($data) %}——如果
$data完全没传,PHP编译前就会报错中断



















