thinkphp 6 必须使用 session::set()、session::get() 等静态方法或 $request->session() 操作 session,禁用 $_session;cookie::set() 需正确配置 config/cookie.php 才能持久化,模板中用 {$think.session.xxx} 读取。

ThinkPHP 6 的 Session 和 Cookie 操作不能直接用 $_SESSION 或 setcookie(),必须走框架封装的接口,否则会失效或报错。
Session::set() 和 Session::get() 是标准写法
TP6 禁用了原生 $_SESSION 和所有 session_* 函数。你只能用 Session 类静态方法或 Request 对象的 session() 方法:
-
Session::set('user_id', 123)—— 设置值,第二个参数为null表示清空该 key -
Session::get('user_id')—— 获取值;Session::get('user_id', 'guest')可设默认值 -
Session::has('user_id')—— 判断是否存在,比!== null更可靠 -
Session::pull('user_id')—— 取值后自动删除,适合一次性闪存(如登录成功提示) -
Session::clear()—— 清空全部 session,不是Session::clear('')
注意:中间件里必须启用 \think\middleware\SessionInit::class,否则 Session 类不生效。
Request::session() 在控制器里更常用
在带 Request 参数的方法中,直接调用 $request->session('key') 更简洁,且支持链式读取:
-
$request->session('user.name')—— 支持点号嵌套读取(前提是存的是数组) -
$request->session()—— 不传参时返回整个 session 数组 - 但
$request->session('missing_key')返回null,不会抛异常
不要混用 Session::get() 和 $request->session() 读同一个 key 后再写,可能因底层缓存不一致导致值“消失”。
Cookie::set() 必须配 config.php 才能持久化
Cookie::set() 默认只在当前请求有效,要让 cookie 写入浏览器并持久存在,必须检查 config/cookie.php 中的配置项:
-
'expire' => 3600—— 单位是秒,0表示关闭浏览器即失效 -
'path' => '/'—— 若设为'/admin',前端 JS 就读不到这个 cookie -
'httponly' => true—— 防 XSS,设为true后 JS 无法用document.cookie读取 -
'secure' => true—— 强制 HTTPS 下才发送,本地开发用false,上线必须开
常见错误:Cookie::set('token', 'abc') 后立刻 var_dump($_COOKIE) 看不到,因为 PHP 的 $_COOKIE 是请求开始时快照,新设的 cookie 要等下一次请求才进 $_COOKIE。
模板里读 Session 用 {$Think.session.xxx},别写错语法
View 模板中读 session 只能用 ThinkPHP 特有的变量语法:
-
{$Think.session.user_id}—— 正确,点号访问 -
{$Think.session['user_id']}—— 错误,模板引擎不支持方括号 -
{$Think.cookie.token}—— 同理,可读 cookie,但前提是已配置且已写入
如果页面刷新后始终读不到,先确认是否漏了 use think\Session;,再检查浏览器开发者工具 Application → Cookies 里有没有对应域名下的 cookie,没有就说明 Cookie::set() 根本没发出去——大概率是 config/cookie.php 的 'setcookie' 设成了 false。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











