resource是PHP中不可手动创建的特殊类型,仅由fopen、mysqli_connect等函数返回,代表对外部资源(如文件、数据库)的句柄通道;它不可直接输出、序列化或转换,须用is_resource()判断有效性(关闭后返回false),并配合配套函数操作。

resource 是 PHP 里不能自己造出来的“遥控器”
它不是字符串、数组或对象那种能直接赋值或 new 出来的类型,而是 PHP 内部用特殊机制生成的句柄,只在调用特定函数时出现。比如 fopen() 成功返回一个 resource,失败则返回 false;mysqli_connect() 同理——它代表你“拿到了通往外部资源的一条通道”,但本身不存数据。
常见误区是把它当普通变量处理:试图 echo $res 会报 Warning,json_encode($res) 返回 null,(array) $res 得到空数组。这不是 bug,是设计使然。
怎么判断一个变量是不是有效的 resource
必须用 is_resource(),但要注意它只认“活着的”资源:
- 刚
fopen()成功 →is_resource()返回true - 接着
fclose()关闭了 → 再次调用is_resource()就是false(哪怕变量还存在) -
null、false、未定义变量、已关闭的资源句柄 → 全部返回false - PHP 8.0+ 中某些扩展(如
ext/hash)把原来返回 resource 的函数改成了返回 object,这时is_resource()永远 false,得换用is_object()
resource 类型能干啥、不能干啥
它只起“中转站”作用,所有操作都得靠配套函数:
立即学习“PHP免费学习笔记(深入)”;
- 文件资源 → 必须用
fread()、fgets()、fwrite()等,不能直接下标取内容 - MySQL 查询结果资源(
mysqli_query()返回)→ 必须用mysqli_fetch_assoc()逐行读,不能foreach($res as ...) - 不能用
isset()判断是否“有内容”,它只判断变量是否存在且非 null - 不能序列化(
serialize()报错),不能 JSON 化,不能传给大多数通用工具函数 - 忘记
fclose()或mysqli_close()?可能触发“Too many open files”系统级错误
调试时怎么看清 resource 到底是什么
单靠 var_dump($res) 只能看到类似 resource(5) of type (stream) 这种信息,真正有用的是组合使用:
- 先确认是不是 resource:
if (!is_resource($res)) { /* 处理错误 */ } - 再看类型:
get_resource_type($res)返回字符串,如"stream"、"mysql link"、"curl" - 注意:
get_resource_type()对非 resource 参数会触发 warning,务必确保前面已用is_resource()守住 - 想看底层 ID(调试用):
(int) $res可强制转成整数 ID,但无业务意义,仅限日志追踪
resource 的本质就是个轻量级代理,PHP 不让你碰它内部结构,只提供一套受控接口。越早接受它“不可见、不可变、不可泛化”的特性,越少掉坑里。



















