ThinkPHP 6.0.1 彻底移除 input()、cookie()、config()、dump() 等全局助手函数,必须分别替换为 Request::param()、Cookie::get()、Config::get()、Debug::dump(),且需正确 use 对应门面,运行时写配置和链式调用已被禁止。

input()、cookie()、config()、dump() 等全局助手函数在 ThinkPHP 6.0.1 中已全部移除,不是“偶尔失效”,而是彻底不存在——直接运行旧代码必报 Fatal error: Uncaught Error: Call to undefined function。
input() 和 request() 调用方式必须重写
TP6.0.1 不再提供input() 函数,request() 也仅作为门面存在(需 use think\facade\Request;),且行为更严格:
- input('id') → 改为 Request::param('id') 或控制器内 $this->request->param('id')
- input('post.name') → 必须拆成 Request::post('name'),不能混用点号语法
- 原来的三层过滤参数 input('id/d', 0, 'intval') 已不支持:第三个参数(过滤器)被移除,需手动处理或改用验证器
- 构造函数、静态方法、中间件早期阶段调用 Request::param() 可能返回 null,因请求对象尚未完全初始化
cookie() / session() 必须改用门面或组件
cookie('token') 和 session('user') 直接报错,因为函数被删,但组件仍在:
- 写入:Cookie::set('token', 'abc', ['httponly' => true])
- 读取:Cookie::get('token')(注意:不传默认值时返回 null,非空字符串)
- Session 同理:Session::get('user')、Session::set('user', $data)
- 若在非控制器类中使用,需先 use think\facade\Cookie; 或注入 think\Cookie 实例
- 配置仍由 config/cookie.php 控制,但 secure、domain 等项若设错(如 HTTPS 站点未开 secure => true),会导致写入静默失败
config() 读写分离 + 缓存固化
config('app.debug') 还能用,但有严重隐含行为:
- 首次调用后,配置值会被永久缓存,改 config/app.php 文件不生效,必须清空 runtime/cache/
- config('app.debug', true) 运行时写配置 → 直接抛出 think\Exception,已被禁止
- 动态配置必须走环境变量:在 .env 中写 APP_DEBUG=true,再用 Env::get('app_debug', false)(需 use think\facade\Env;)
- 所有配置读取必须显式指定完整路径,config('debug')(无前缀)无效,必须是 config('app.debug')dump() 替换为 Debug::dump(),且不可链式
dump($data) 报错是必然的,TP6.0.1 默认不加载调试函数:
- 必须在文件顶部加 use think\facade\Debug;
- 调用 Debug::dump($data),返回类型为 void,写成 Debug::dump($a)->dump($b) 会爆 Call to a member function dump() on null
- 不支持 echo 或 return 包裹,它直接输出并终止后续执行(类似原生 var_dump() + die())
- 生产环境建议禁用该门面,或改用 Log::info() 记录结构化数据
真正卡住人的地方不在“怎么换”,而在“换完还出错”——比如 Request::param() 返回空却没报错,其实是请求类型不匹配(GET 请求里调了 post());又比如 Cookie::get() 返回 null,但你忘了检查 headers_sent() 是否已被触发。这些细节不逐个验证,光改函数名没用。



















