thinkphp 5.0 模板中不可直接使用 $_session、$_get 等超全局变量,须通过 {$think.session.xxx}、{$think.request.xxx} 等框架映射语法访问,否则报错或为空;未初始化 session 时 {$think.session.*} 可能失效。

ThinkPHP 5.0 前端模板里不能直接用 $_SESSION、$_SERVER 这类 PHP 超全局变量,必须通过框架预置的 {$Think.*} 或 {$Request.*} 语法访问 —— 否则会报错或输出空值。
模板中调用 session / cookie / config 等全局数据
TP5 把常用全局变量映射到 {$Think} 命名空间下,底层对应的是 \think\template\driver\Think 模板引擎对 Request、Session、Cookie、Config 等对象的自动注入和解析。
-
{$Think.session.user_id}→ 等价于Session::get('user_id'),不是$_SESSION['user_id'] -
{$Think.cookie.token}→ 对应Cookie::get('token'),受加密/前缀配置影响(如cookie_prefix) -
{$Think.config.app_debug}→ 输出config/app.php中定义的app_debug值 -
{$Think.env.host}→ 读取环境变量(需已通过.env或putenv()设置)
为什么 $_GET 或 $_POST 在模板里拿不到
因为 TP5 模板引擎默认不暴露超全局数组,且 $_GET 等未经过框架过滤和统一处理,直接暴露有安全风险。框架强制你走 param 或 Request 接口。
- 错误写法:
{$Think.get.id}(不存在该路径,始终为空) - 正确写法:
{$Think.request.id}或{$Request.param.id},等价于input('param.id') - 路由参数(如
/user/123中的123)只能通过param获取,get和post方法都拿不到
在控制器里提前 assign 全局变量给模板
如果 {$Think.*} 不够用(比如要传自定义的运行时变量、计算结果),必须在控制器中显式 $this->assign(),模板才能接收到。
- 在基类控制器
Base的_initialize()里统一赋值:$this->assign('site_name', config('site.name')); - 避免在每个方法里重复写
assign,但注意:模板中{$site_name}和{$Think.config.site.name}是两套机制,前者是局部变量,后者是配置快照 - 若变量含 HTML 内容(如富文本页脚),记得加
|raw过滤器:{$footer|raw},否则会被自动转义
容易被忽略的坑:APP_DEBUG 关闭后 {$Think.session} 可能为空
当 APP_DEBUG = false 且未开启 session 自动启动(session.auto_start = 0),Session::init() 可能未触发,导致 {$Think.session.*} 全部失效 —— 这不是模板问题,而是底层 session 初始化时机问题。
- 解决方案:在
application/tags.php的app_init钩子中手动调用Session::init() - 或者确保
session_start()已在入口前执行(如在public/index.php顶部加一行) - 调试时可临时打开
APP_DEBUG看是否恢复,确认是初始化顺序而非语法错误
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











