ThinkPHP6通过View::assign()将变量注入模板引擎上下文,支持{ $name }语法;PHP原生依赖include作用域传递,仅能用<?php echo $name; ?>。

理解ThinkPHP6与PHP原生在视图变量传递上的区别,关键在于识别框架封装层是否介入、变量作用域是否自动注入、模板引擎是否参与解析——这直接决定你在控制器里写$name = '张三'后,模板中能否直接用{$name}输出。
PHP原生方式:变量靠include时的局部作用域传递
在纯PHP中,视图本质就是被include的普通PHP文件,变量传递完全依赖PHP自身的作用域规则。
第一步:在控制器中定义变量并include模板文件: $user = ['id'=>1, 'name'=>'李四']; include './view/index.php';
第二步:在view/index.php中直接使用:<?php echo $user['name']; ?>
立即学习“PHP免费学习笔记(深入)”;
这一步操作起来很简单,但【变量必须在include前定义,且不能是函数内部的局部变量】。如果把$user定义在function render() { ... }里再include,模板里就访问不到——PHP不会自动把函数作用域里的变量透传给被包含文件。
ThinkPHP6方式:通过View::assign()或魔术赋值注入模板引擎上下文
TP6不依赖PHP原生include作用域,而是把变量注册进think\View实例的内部数据容器,再由模板引擎(如think-template)在解析{ $name }时从该容器取值。
方法一:使用assign()链式调用
return View::assign('title', '首页')->assign('list', $data)->fetch();
方法二:使用数组批量赋值
return View::assign(['title' => '首页', 'list' => $data])->fetch();
方法三:利用魔术方法直接赋值(等效于assign)
View::title = '首页'; View::list = $data; return View::fetch();
注意:【fetch()必须在所有assign之后调用,否则变量不会进入当前渲染上下文】。如果先fetch()再assign(),模板里依然为空。
核心差异落地表现:模板中怎么写才有效
第一步:确认你用的是哪种模板引擎
若未安装topthink/think-view,框架默认只支持PHP原生模板——此时View::assign()无效,模板里只能用<?= $title ?>,且变量必须靠extract()或include作用域带入。
第二步:检查config/view.php中的type配置
如果'type' => 'php',那你写的{ $title }会报错;必须改成'type' => 'think'(即启用think-template),才能识别花括号语法。
第三步:验证变量是否真被注入
在模板开头加一行{:dump($title)},如果输出null,说明assign()没执行或键名拼错;如果输出字符串,说明注入成功。
第四步:区分fetch()的模板定位逻辑
不带参数调用View::fetch()时,TP6会按控制器名/方法名自动匹配view/index/index.html;若手动指定路径如View::fetch('public/header'),则变量仍有效——因为assign绑定的是整个View实例,不是某个具体模板文件。



















