thinkphp 6 中不存在全局变量 _request,也不支持直接使用 $_request、$_get 等超全局数组;必须通过 think\facade\request 门面或依赖注入 think\request 实例获取请求数据,所有输入均需经其统一处理。

ThinkPHP 6 的 \_Request 对象根本不存在
直接说结论:ThinkPHP 6 中没有全局变量 \_Request,也**不支持通过 \_REQUEST、\_GET 等超全局数组直接访问请求数据**。这是很多从 TP5 或原生 PHP 迁移过来的人最容易踩的坑。
TP6 强制使用依赖注入或 think\facade\Request 门面获取请求对象,所有输入都必须经由 Request 实例统一处理(含过滤、验证、类型转换等)。硬写 \_Request 会报 Undefined variable: _Request 或直接解析为 null。
正确获取输入:用 think\facade\Request 或注入 think\Request
两种方式效果一致,推荐门面写法更简洁;控制器方法参数注入则更适合需要强类型提示或单元测试的场景。
- 门面方式(在任意位置):
use think\facade\Request; $value = Request::param('name'); // 获取所有输入(POST/GET/ROUTE 合并) $value = Request::get('id'); // 仅 GET $value = Request::post('token'); // 仅 POST(含 JSON、XML 自动解析) $value = Request::rule('email', 'email'); // 带验证规则获取 - 依赖注入方式(仅限控制器方法):
public function index(\think\Request $request) { $id = $request->get('id'); $data = $request->only(['username', 'email'], 'post'); }
注意:Request::param() 默认开启 filter(如去除空格、转义),而 get()/post() 不自动过滤,需手动传 ['filter' => 'htmlspecialchars'] 参数。
为什么不能直接用 $_POST 或 $_GET?
TP6 的中间件机制和请求生命周期设计决定了:原始超全局数组可能已被修改(如 CORS 中间件重写 header)、未经过路由绑定、缺少上下文(如子域名识别)、无法触发自动验证或类型转换。
- JSON 请求体不会自动填充到
$_POST,但Request::post()会自动解析application/json数据 - URL 中带点号的参数(如
?user.name=xxx)会被 PHP 自动转成下划线(user_name),而Request::param()保留原始键名 - 上传文件必须用
$request->file('avatar'),$_FILES缺少 TP 封装的移动、验证、信息提取能力
兼容旧代码的临时方案(不推荐长期使用)
如果老项目迁移量大,可封装一个兼容函数,但务必明确标注“过渡用”:
function _request($key = null, $default = null, $filter = '')
{
$request = \think\facade\Request::instance();
return $key ? $request->param($key, $default, $filter) : $request->param();
}
这个函数只是语法糖,底层仍是 Request 实例。千万别试图在全局作用域定义 $_Request 变量——它不会随每次请求更新,会导致严重数据污染。
真正要注意的是:TP6 的 Request 是单例+请求生命周期绑定的,每次 HTTP 请求都会重建实例。任何缓存、静态属性或全局变量绕过它,都会破坏这个契约。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











