TP8.0 彻底移除了 input()、cookie()、session()、config()、lang()、dump()、request() 这7个全局助手函数,必须逐个替换为对应门面或 Request 对象方法,否则无法启动或静默失效。

TP5.1 升级到 TP8.0 后“函数不存在”报错,不是配置问题,是全局助手函数被彻底移除——不替换就无法启动,且部分调用会静默失效(比如 input() 不再自动合并 POST/GET)。必须逐个定位、逐个替换,没有捷径。
哪些函数被删了?直接搜这 7 个名字
在项目根目录执行全局搜索(推荐 VS Code 或 grep -r "input(" . --include="*.php"),盯住以下函数调用,一个都不能留:
-
input():包括input('id')、input('post.name')、input('id/d', 0, 'intval') -
cookie()和session():如cookie('token')、session('user') -
config():如config('database.hostname'),注意它还支持写操作(config('app.debug', true)),而 TP8 禁止运行时写 -
lang():如lang('user.not_found') -
dump():如dump($data),TP8 改用Debug::dump() -
request():该函数在 TP8 中仅限请求生命周期内可用,控制器构造函数或静态方法里调用会返回null
input() 怎么替?别只改函数名,参数逻辑全变了
input() 在 TP8 中已废弃,且行为不可逆:它不再自动解析混合来源(GET/POST/PUT body),也不再支持三层过滤参数。必须用 Request 对象显式指定来源和过滤。
- 原写法
input('id')→ 改为$this->request->param('id')(控制器内)或app('request')->param('id')(非控制器) - 原写法
input('post.name')→ 改为$this->request->post('name');input('get.id')→$this->request->get('id') - 原写法
input('id/d', 0, 'intval')→ 第三个参数(过滤器)已被移除,必须拆解:$this->request->param('id', 0, 'intval')(注意:这是param()方法的第三个参数,不是input()的) - 若原来依赖
input()自动识别 JSON body,现在需显式判断:$this->request->isJson() ? $this->request->post() : $this->request->param()
cookie()/session()/config() 替换三原则
这三个函数不是简单换对象,涉及绑定机制、命名空间和写权限变更,漏掉任一细节都会报错或静默失败。
-
cookie('token')→$this->cookie->get('token')(控制器内);非控制器中用Cookie::get('token'),需use think\facade\Cookie; -
session('user')→$this->session->get('user')或Session::get('user')(同上需use think\facade\Session;) -
config('app.debug')→Config::get('app.debug'),顶部必须use think\facade\Config;;禁止config('app.debug', true),TP8 禁止运行时修改配置,应改用环境变量(.env)或启动前注入
Db::name() 和模型动态 where 报错?不是语法错,是架构砍掉了
Db::name('user') 和 whereTime() 类方法不是“暂时不兼容”,是 TP8 底层 ORM 彻底重构后被物理删除——找不到方法就会 Fatal error,且不会 fallback。
-
Db::name('user')->where('id', 1)->find()→ 必须改为Db::table('user')->where('id', 1)->find();不能传模型类名,只能传真实表名字符串 - 更推荐走模型:
UserModel::where('id', 1)->find(),但模型类必须继承think\Model,且开启严格模式后字段名不匹配会直接抛异常,务必核对$schema或数据库实际字段 -
whereTime('create_time', 'today')→ 没有兼容层,必须重写:where('create_time', '>=', date('Y-m-d'))->where('create_time', ' -
whereIn('id', [])→ TP8 会直接报错,必须前置判空:!empty($ids) ? whereIn('id', $ids) : whereRaw('1=0')
最易被忽略的是中间件注册方式:TP8 要求中间件必须传完整命名空间类名(\app\middleware\Check::class),字符串别名('check')会静默跳过,请求根本不进中间件——这种问题不会报错,但权限、日志等逻辑全部失效。

















