is_resource()
La función is_resource() de PHP comprueba si una variable es un recurso abierto. Aprende su sintaxis, comportamiento y el cambio en PHP 8.
Introducción
is_resource() es una función integrada de PHP que comprueba si una variable contiene un recurso. Un recurso es un tipo especial de PHP que actúa como un identificador de algo que vive fuera de PHP en sí: un archivo abierto, una conexión a base de datos, un socket de red o una imagen que se está construyendo en memoria. No puedes inspeccionar el valor de un recurso directamente como harías con un string o un array; solo puedes pasarlo a las funciones que saben cómo usarlo (fread(), fclose(), etcétera).
is_resource() devuelve true cuando la variable es un recurso abierto y false para cualquier otro tipo, incluido un recurso que ya ha sido cerrado. Esta página cubre la sintaxis, el comportamiento en tiempo de ejecución, el importante cambio en PHP 8 que debes conocer y cómo se relaciona con las demás funciones de comprobación de tipos.
Sintaxis
is_resource(mixed $value): boolRecibe un único argumento —la variable que deseas comprobar— y devuelve un boolean. Nunca lanza excepciones ni modifica su argumento, por lo que es seguro llamarla con cualquier valor.
Ejemplo de uso
Un identificador de archivo devuelto por fopen() es el recurso más común que encontrarás:
<?php
$handle = fopen("php://temp", "r"); // a real, open resource
$text = "hello"; // a plain string
var_dump(is_resource($handle)); // bool(true)
var_dump(is_resource($text)); // bool(false)
fclose($handle);
?>Usa var_dump() en lugar de echo aquí: un true se imprime como 1, pero un false se imprime como una cadena vacía, lo que puede llevar a confusión. var_dump() imprime el tipo y el valor de forma inequívoca.
Un recurso cerrado ya no es un recurso
Este es el error que confunde a la gente. Una vez que cierras un identificador, is_resource() devuelve false para él: no permanece en true. Esto hace que la función sea una cómoda protección contra el uso de un identificador dos veces:
<?php
$handle = fopen("php://temp", "w");
var_dump(is_resource($handle)); // bool(true)
fclose($handle);
var_dump(is_resource($handle)); // bool(false) — already closed
?>Protegerse con is_resource() antes de un fwrite() o un segundo fclose() evita las advertencias de "el recurso suministrado no es un recurso de flujo válido".
El cambio en PHP 8: muchos recursos ahora son objetos
En PHP 8.0, una gran cantidad de extensiones integradas migraron de recursos a objetos opacos. Los identificadores de Curl, las imágenes de GD y varios otros antiguos recursos son ahora objetos, por lo que is_resource() devuelve false para ellos aunque conceptualmente se comporten de la misma manera:
<?php
$ch = curl_init(); // PHP 7: a resource — PHP 8: a CurlHandle object
var_dump(is_resource($ch)); // bool(false) on PHP 8+
var_dump(is_object($ch)); // bool(true) on PHP 8+
?>Si mantienes código que se ejecuta tanto en PHP 7 como en PHP 8, no asumas que un identificador de curl o GD es un recurso. Comprueba el tipo específico que esperas, o acepta ambos con is_resource($x) || is_object($x).
Averiguar qué tipo de recurso tienes
Cuando is_resource() es true, get_resource_type() te indica qué tipo es: "stream" para archivos, "curl" en PHP 7, "gd" para imágenes, etcétera:
<?php
$handle = fopen("php://temp", "r");
echo get_resource_type($handle), "\n"; // stream
fclose($handle);
?>¿Cuándo la usaría?
- Protecciones defensivas. Antes de llamar a
fread(),fwrite()ofclose()sobre un valor que no creaste tú mismo, confirma que sigue siendo un recurso abierto. - Funciones que aceptan "un identificador o una ruta". Un helper puede recibir tanto un string con un nombre de archivo como un identificador ya abierto;
is_resource()te permite bifurcar según cuál recibiste. - Lógica de limpieza. En un bloque
finallyo en un destructor,if (is_resource($h)) fclose($h);evita cerrar un identificador dos veces.
Funciones relacionadas
is_resource() es uno de los predicados de comprobación de tipos de la familia de PHP. Para otros tipos, usa is_object(), is_array() o is_string(). Si quieres el nombre del tipo como string en lugar de una comprobación boolean, usa gettype(), que devuelve "resource" (o "resource (closed)") para los identificadores.
Conclusión
is_resource() confirma que una variable es un identificador abierto a un recurso externo, devolviendo false para identificadores cerrados y para cualquier otro tipo. Lo que hay que recordar en el PHP moderno es que desde PHP 8 muchos antiguos recursos —los identificadores de curl y GD entre ellos— son objetos, así que comprueba con is_object() (o verifica ambos) cuando tu código apunte a PHP 8+.