¿Qué son los "recursos" en PHP? > Blog | Josep Salvà - Desarrollo Web

La palabra de Wifft

Los recursos de PHP son un aspecto por lo general poco conocido del lenguaje (a nivel teórico), pero ampliamente utilizados a nivel práctico, en muchos casos, sin que el desarrollador sea consciente de ello.

Por definición, un "recurso" es un tipo de dato (como lo es un string, un integer, o boolean) especial que contiene una referencia hacia un recurso externo (un stream, un archivo o una conexión de base de datos) para que así esta sea usada por funciones nativas y que de esta manera sea posible (co)operar respecto al recurso proporcionado. En el sentido más técnico, no es un tipo de dato escalar, ya que no puede usarse en operaciones de tipado y casteo (puesto que carece de sentido).

Por ejemplo, si ejecutamos el siguiente código:

$file = fopen('/etc/passwd', 'r');

echo gettype($file);

Nos imprime que $file es un recurso (resource), puesto que es el tipo de dato devuelto por fopen a partir del archivo y modo de acceso especificado.

Si ejecutamos

echo $file;

Nos imprime Resource ID: #2, es decir, el identificador (referencia) hacia el recurso externo cargado en memoria.

Pero... ¿Y si queremos obtener el nombre del tipo de recurso sobre el que estamos operando? Par ello, PHP posee la función nativa get_resource_type(), que devuelve el tipo exacto del recurso proporcionado.

Con el ejemplo anterior, si ejecutamos

//Comprobamos que efectivamente se trata de un recurso.
//En caso contrario, devolvería false y lanzaría una excepción.
if (is_resource($file)) {
    echo get_resource_type($file);
}

Nos imprime stream, ya que es el tipo de recurso generado por fopen.

Si por ejemplo usáramos la función curl_init(), nos imprimiría cURL handle. Y así con todas las funciones que devuelven un recurso.

Cabe destacar que la generación de un recurso implica la creación de una referencia al mismo (como si utilizáramos &) pero el contador de referencias del recolector de basura de Zend se encarga de que se libere de manera automática cuando no es utilizado, lo que exime de tener que llevar a cabo una liberación manual alguna función de cierre (fclose(), curl_close()) en el 95% de los casos. Aun así, se considera buena práctica el uso de cierres explícitos.

Nota: A partir de la versión 8.0 de PHP, los recursos están siendo progresivamente reemplazados por objetos. Se puede leer acerca del tema en este enlace.