W3docs

get_resource_type()

La funzione get_resource_type() in PHP restituisce il tipo di risorsa di una variabile risorsa, utile per debug e validazione.

Introduzione

get_resource_type() è una funzione PHP integrata che restituisce una stringa che indica il tipo di risorsa contenuta in una variabile — ad esempio "stream" per un file aperto, o "process" per un programma esterno in esecuzione.

Una risorsa è una speciale variabile PHP che contiene un riferimento a qualcosa che vive al di fuori di PHP: un file aperto, un socket di rete, un'immagine in costruzione in memoria, un processo figlio e così via. Poiché l'oggetto sottostante è opaco, non è possibile ispezionarlo direttamente. get_resource_type() fornisce un'etichetta leggibile dall'uomo su cosa sia quella risorsa, utile per il logging, il debugging e la scrittura di funzioni che accettano diversi tipi di risorse ma ne gestiscono solo alcuni.

Questa pagina tratta la sintassi, le stringhe dei tipi di risorsa che incontrerai nella pratica, un'importante avvertenza per PHP 8 (molte ex "risorse" sono ora object), e come usare la funzione in modo sicuro.

Sintassi

get_resource_type(resource $handle): string

Accetta un singolo parametro:

  • $handle — la risorsa di cui si vuole conoscere il tipo. Deve essere un valore di risorsa attivo.

Restituisce una string in minuscolo che identifica il tipo di risorsa. Se si passa qualcosa che non è una risorsa, PHP 8 genera un TypeError (in PHP 7 emetteva un avviso e restituiva null).

Esempio base

La risorsa più comune che si ispeziona è un handle di file/stream da fopen():

<?php
$file = fopen("php://memory", "w+");

echo get_resource_type($file), PHP_EOL; // stream

fclose($file);
?>

Output:

stream

php://memory è uno stream reale e sempre disponibile, quindi questo esempio funziona ovunque senza bisogno di un file su disco.

Stringhe comuni dei tipi di risorsa

Funzioni diverse creano tipi di risorsa diversi. Ecco alcuni che è probabile incontrare:

<?php
$file = fopen("php://memory", "r");
echo get_resource_type($file), PHP_EOL;   // stream

$ctx = stream_context_create();
echo get_resource_type($ctx), PHP_EOL;    // stream-context

$proc = proc_open("echo hi", [], $pipes);
echo get_resource_type($proc), PHP_EOL;   // process
proc_close($proc);
?>

Output:

stream
stream-context
process

Le stringhe esatte provengono dall'estensione che ha creato la risorsa, quindi sono nomi stabili su cui si può fare affidamento ("stream", "curl" nelle versioni PHP precedenti, "gd" per i vecchi handle immagine, ecc.).

Attenzione: PHP 8 ha trasformato molte risorse in object

Questo è il punto più importante da tenere a mente. A partire da PHP 8.0, diverse estensioni hanno migrato i loro vecchi tipi di risorsa in veri object. Gli handle cURL, le connessioni MySQLi, le immagini GD e altri non sono più risorse — quindi get_resource_type() genera ora un TypeError su di essi:

<?php
$ch = curl_init();           // PHP 8: returns a CurlHandle object, not a resource
echo gettype($ch), PHP_EOL;  // object

// get_resource_type($ch);   // TypeError: must be of type resource, CurlHandle given
?>

Output:

object

Quindi i tutorial più vecchi che mostrano get_resource_type($curlHandle) che restituisce "curl" sono obsoleti. Per questi handle basati su object, usa invece get_class() / instanceof. Gli stream di file da fopen() sono ancora risorse genuine, motivo per cui rimangono l'esempio affidabile.

Proteggere il codice da valori non-risorsa

Poiché passare un valore non-risorsa genera un TypeError in PHP 8, verifica prima con is_resource() quando il valore potrebbe essere chiuso o false:

<?php
$file = fopen("php://memory", "r");
fclose($file);

if (is_resource($file)) {
    echo get_resource_type($file);
} else {
    echo "Not an active resource";
}
?>

Output:

Not an active resource

Dopo fclose(), la variabile diventa una risorsa chiusa: is_resource() restituisce false, e gettype() riporta "resource (closed)". Questo tipo di controllo preventivo evita un TypeError fatale.

Quando usarla?

  • Validare l'input di una funzione che dovrebbe accettare solo un tipo specifico di risorsa (ad es. rifiutare tutto ciò che non è uno "stream").
  • Debug / logging — registrare cosa sia effettivamente una risorsa quando si cerca di individuare un bug.
  • Logica a rami in librerie che gestiscono diversi tipi di risorsa in modo differente.

Per un semplice controllo "questa è una risorsa?" preferisci is_resource(); ricorri a get_resource_type() solo quando hai bisogno di distinguere quale tipo di risorsa sia.

Conclusione

get_resource_type() restituisce una string che descrive il tipo di risorsa contenuto in una variabile, utile per la validazione, il debugging e la logica a rami specifica per tipo. Ricorda il cambiamento di PHP 8: molti handle che un tempo erano risorse (cURL, MySQLi, GD) sono ora object e genereranno un TypeError — per questi, usa get_class(). Abbina get_resource_type() a is_resource() per non chiamarla mai su un valore chiuso o non valido.

Pratica

Pratica
Cosa fa la funzione get_resource_type() in PHP?
Cosa fa la funzione get_resource_type() in PHP?
Was this page helpful?