为什么unset无法清除上传后的$_FILES内容,如何正确清空该变量?
问题原因
- 超全局变量的存储特性:$_FILES是PHP内核维护的超全局变量,在请求启动阶段就会根据上传的文件数据完成初始化,它的实际存储位置和普通全局变量不同。
- 操作方法错误:你测试代码中调用的
unset($GLOBALS['$_FILES'])存在两处问题:- 键名错误:$GLOBALS数组中存储全局变量的键名不需要加
$符号,对应$_FILES的正确键名是'_FILES',你写的'$_FILES'是不存在的键,删除操作根本没有命中目标变量。 - 即使写对键名
unset($GLOBALS['_FILES']),也只是删除了$GLOBALS数组对超全局变量$_FILES的引用映射,不会删除内核中存储的实际上传数据,后续访问$_FILES时内核会自动重建引用,还是能拿到完整的上传数据。
- 键名错误:$GLOBALS数组中存储全局变量的键名不需要加
正确清空$_FILES的方法
- 完全清空所有上传数据:直接给$_FILES赋值为空数组即可,这是兼容性最好、最稳妥的方案,清空后变量依然是数组类型,不会触发后续访问的未定义变量错误:
$_FILES = [];
- 删除单个上传文件的条目:如果不需要清空全部数据,只需要删除指定name的上传记录,直接unset对应键即可:
unset($_FILES['pdf']);
注意:不要直接调用
unset($_FILES)清空整个变量,该操作会销毁当前作用域内的$_FILES变量引用,后续再访问该变量会抛出未定义变量的警告,影响后续代码的正常判断逻辑。
内容的提问来源于stack exchange,提问作者Omar AbdElwahhab
相关产品推荐
相关产品推荐

