get_resource_id() 是 php 8.0 新增函数,用于安全获取 resource 类型的唯一整数 id;它替代了不安全的 (int)$resource 强制转换,避免类型混淆和运行时警告,要求参数为有效 resource,否则抛出 typeerror。

get_resource_id() 是 PHP 8.0 新增的内置函数,用于**安全、统一地获取资源(resource)类型的唯一整数标识符**。它替代了过去依赖 (int)$resource 强制转换的不推荐做法,避免了类型混淆和潜在错误。
为什么不用 (int) $resource?
在 PHP 8.0 之前,开发者常通过强制类型转换获取资源 ID:
❌ 不推荐(PHP 8.0+ 可能触发警告或行为异常):$fp = fopen('test.txt', 'r');
$id = (int) $fp; // 依赖内部实现,PHP 8.0+ 中 resource 不再隐式转为 int
PHP 8.0 起,resource 类型不再支持自动转换为整数,直接 (int) 会返回 0 或触发 E_NOTICE,结果不可靠。
正确用法:get_resource_id()
该函数接受一个 resource 类型变量,返回其底层唯一的非负整数 ID;若传入非 resource 类型,抛出 TypeError。
$fp = fopen('test.txt', 'r');
if (is_resource($fp)) {
$id = get_resource_id($fp); // 返回如 5、12 等整数
echo "Resource ID: $id";
}
fclose($fp);
适用资源类型与注意事项
- 支持所有原生资源:文件句柄(
fopen)、cURL 句柄(curl_init)、MySQLi 连接(mysqli_connect)、GD 图像(imagecreate)、XML 解析器等 - 资源关闭后,ID 不再有效,但
get_resource_id()仍可返回原 ID(不检查是否已释放);使用前建议配合is_resource()判断 - 不同资源类型 ID 空间独立(例如文件句柄 ID 和 cURL ID 可能重复),但同类型内唯一
- 不能用于 GMP、OpenSSL 等“伪资源”(实际是对象),它们不满足
is_resource(),调用会报错
典型应用场景
- 调试与日志:记录资源生命周期,追踪泄漏(如“打开文件 ID=7,未关闭”)
-
资源池管理:用 ID 作数组键缓存连接(
$pool[get_resource_id($conn)] = $conn;) -
类型安全判断:与
is_resource()配合,明确区分 resource 和 object - 扩展开发:C 扩展中需传递资源 ID 给底层库时,用此函数标准化提取
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











