最直接判断资源类型应使用gettype(),它准确返回"resource"字符串;但is_resource()更实用,因关闭后返回false,且PHP 8.0+多数扩展已改用对象而非资源。

用 gettype() 判断资源类型最直接
PHP 中资源(resource)是特殊类型,比如文件句柄、数据库连接、cURL 句柄等,gettype() 能准确返回字符串 "resource",这是最稳妥的识别方式。
注意:不能用 is_string()、is_object() 或 is_array() 来反向排除——资源既不是对象也不是数组,但也不等于“其余都是资源”。
-
gettype($fp)对fopen()返回的句柄返回"resource" -
gettype($conn)对mysqli_connect()成功返回值也返回"resource"(PHP 8.0+ 已改为对象,需留意版本) - 如果资源已关闭(如
fclose($fp)后再查),gettype()仍返回"resource",但该变量实际已失效
is_resource() 是专用于资源类型的布尔判断函数
它比 gettype() 更轻量,且语义明确:只关心“是不是有效资源”,返回 true 或 false。
关键点在于:is_resource() 在资源被关闭后会返回 false,这点比 gettype() 更实用。
立即学习“PHP免费学习笔记(深入)”;
-
is_resource($fp)→true(打开后) -
fclose($fp); is_resource($fp)→false(关闭后立即失效) -
is_resource(null)、is_resource(123)、is_resource([])全部返回false - 不适用于 PHP 8.0+ 的
mysqli对象(它们是mysqli类实例,不是资源)
PHP 8.0+ 中资源类型大幅减少,别默认“连接=资源”
从 PHP 8.0 开始,mysqli、PDO、GD 等扩展逐步弃用资源,改用原生对象。这意味着你不能再假设所有数据库句柄都是资源。
-
mysqli_connect()在 PHP 7.x 返回 resource,在 PHP 8.0+ 返回mysqli对象 -
imagecreate()在 PHP 8.0+ 返回GdImage对象,不再是 resource - 检查前务必确认 PHP 版本和扩展行为,可用
phpversion()+extension_loaded('mysqli')辅助判断 - 跨版本兼容写法建议:优先用具体类方法(如
$conn instanceof mysqli)或扩展提供的类型检测函数(如mysqli_ping())代替泛化资源判断
资源变量无法 JSON 编码,调试时容易误判
资源类型不可序列化,json_encode($fp) 会返回 false,且不报错;var_dump() 显示类似 resource(#5) of type (stream),但 #5 是资源 ID,每次运行可能不同。
- 不要用
json_encode()结果是否为 false 来判断是否为资源——NaN、resource、含循环引用的数组都会导致失败 - 日志中看到
resource(5) of type (stream)说明确实是资源,但 ID 5 不具备可比性,不能用于状态跟踪 - 真正需要判断资源有效性时,应结合业务逻辑:比如对文件资源调用
feof()或fstat(),对 cURL 调用curl_getinfo()
is_resource() + 实际操作校验(如 fread() 是否返回 false)比单纯类型判断更可靠。











