thinkphp6取消全局助手函数,改用依赖注入和门面模式:input()→$request->param(),session()→session::get(),db()→db::table(),model()→usermodel::find(),dump()→debug::dump()或halt()。

ThinkPHP6 中取消了全局助手函数(如 dump、debug、input 等),但数据操作本身没变难,只是入口更集中、依赖注入更明确——关键不是“怎么替代”,而是“该用哪个类、在什么上下文里调用”。
哪里找原来 input() 和 session() 的功能
这些不再是函数,而是由容器自动注入的类实例。最常用的是 think\Request 和 think\Session,它们通过构造函数或 app() 获取:
-
input()→ 改用$request->param()(或$request->get()/$request->post());控制器中直接写$this->request->post('name')更安全 -
session()→ 改用Session::get('key')或$this->session->get('key');注意需先 usethink\facade\Session - 别再用
input('id/d', 0, 'intval')这种链式过滤——TP6 把验证逻辑交给Validate类或请求验证器,参数过滤应显式调用filter_var()或封装校验规则
db() 和 model() 助手函数消失后怎么查数据
TP6 推荐使用依赖注入或门面(Facade)方式访问数据库和模型,避免全局函数带来的测试困难和耦合问题:
-
db('user')->where('id', 1)->find()→ 改为Db::table('user')->where('id', 1)->find(),记得 usethink\facade\Db -
model('User')->find(1)→ 改为UserModel::find(1)(静态调用)或注入UserModel $user后调用$user->find(1) - 门面方式(如
Db、Cache)本质是代理,性能无差异,但要注意:若在非 HTTP 生命周期(如命令行任务)中使用,需确认容器已初始化
为什么不能直接 new 模型或 Db 类
TP6 的核心对象(如 Db、Model)内部依赖容器管理的连接池、查询日志、事件监听等,手动 new 会绕过这些机制,导致:
- 数据库连接未复用,频繁创建连接句柄,高并发下容易触发
Too many connections - 事务无法跨模型生效(
Db::startTrans()只对门面/注入实例有效) - 模型事件(如
before_insert)不触发,因为事件绑定发生在容器实例化阶段 - 正确姿势:控制器/服务类中用
protected $model = UserModel::class;+ 构造注入,或直接静态调用UserModel::create()
调试时没有 dump() 怎么办
dump() 确实没了,但 TP6 内置了更可控的调试支持,别急着装第三方 dump 工具:
- 开发环境开启调试模式后,
halt($data)仍可用(它没被移除),会输出带格式的变量并终止执行 - 更推荐用
think\facade\Debug::dump($data),它比旧版dump()多一层上下文隔离,不会污染响应头 - 想在日志里看数据?用
Log::info('query result', ['data' => $result]),比屏幕 dump 更适合定位异步或定时任务问题 - 切记:线上环境必须关闭调试模式,否则
Debug::dump()会暴露敏感结构,且可能因输出缓冲未清理导致 JSON 响应错乱
真正容易被忽略的不是“怎么写”,而是“在哪写”——比如在中间件里用 $this->request 是安全的,但在自定义命令类里,$this->request 是 null,得改用 app('request') 或重构逻辑。TP6 的取消不是为了增加门槛,是把隐式依赖显性化。写顺了反而更稳。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











