get_resource_type()
Die PHP-Funktion get_resource_type() gibt den Ressourcentyp einer gegebenen Ressource als string zurück. Syntax, Beispiele und PHP-8-Hinweise.
Einführung
get_resource_type() ist eine eingebaute PHP-Funktion, die einen string zurückgibt, der die Art der Ressource einer Variable benennt – zum Beispiel "stream" für eine geöffnete Datei oder "process" für ein laufendes externes Programm.
Eine Ressource ist eine spezielle PHP-Variable, die eine Referenz auf etwas außerhalb von PHP enthält: eine geöffnete Datei, einen Netzwerk-Socket, ein im Speicher erstelltes Bild, einen Kindprozess und so weiter. Da das zugrunde liegende object nicht transparent ist, kann man es nicht direkt inspizieren. get_resource_type() liefert eine menschenlesbare Bezeichnung dafür, was die Ressource ist – hilfreich beim Logging, Debugging und beim Schreiben von Funktionen, die mehrere Ressourcentypen akzeptieren, aber nur manche davon verarbeiten.
Diese Seite behandelt die Syntax, die Ressourcentyp-Strings, die in der Praxis vorkommen, einen wichtigen PHP-8-Hinweis (viele frühere „Ressourcen" sind jetzt Objekte) und die sichere Verwendung der Funktion.
Syntax
get_resource_type(resource $handle): stringDie Funktion nimmt einen einzigen Parameter entgegen:
$handle— die Ressource, deren Typ abgefragt werden soll. Es muss sich um einen aktiven Ressourcenwert handeln.
Sie gibt einen Kleinbuchstaben-string zurück, der den Ressourcentyp identifiziert. Wird etwas übergeben, das keine Ressource ist, wirft PHP 8 einen TypeError (in PHP 7 wurde eine Warnung ausgegeben und null zurückgegeben).
Einfaches Beispiel
Die häufigste Ressource, die man untersucht, ist ein Datei-/Stream-Handle von fopen():
<?php
$file = fopen("php://memory", "w+");
echo get_resource_type($file), PHP_EOL; // stream
fclose($file);
?>Ausgabe:
streamphp://memory ist ein echter, immer verfügbarer Stream, sodass dieses Beispiel überall läuft, ohne dass eine Datei auf dem Datenträger benötigt wird.
Häufige Ressourcentyp-Strings
Verschiedene Funktionen erzeugen unterschiedliche Ressourcentypen. Einige, denen man wahrscheinlich begegnet:
<?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);
?>Ausgabe:
stream
stream-context
processDie genauen Strings stammen von der Extension, die die Ressource erstellt hat, und sind daher stabile Namen, die man vergleichen kann ("stream", "curl" bei älterem PHP, "gd" für ältere Image-Handles usw.).
Achtung: PHP 8 hat viele Ressourcen in Objekte umgewandelt
Das ist der wichtigste Fallstrick. Im Verlauf von PHP 8.0 haben mehrere Extensions ihre alten Ressourcentypen zu echten Objekten migriert. cURL-Handles, MySQLi-Verbindungen, GD-Bilder und andere sind keine Ressourcen mehr – daher wirft get_resource_type() jetzt einen TypeError für diese:
<?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
?>Ausgabe:
objectÄltere Tutorials, die zeigen, dass get_resource_type($curlHandle) den Wert "curl" zurückgibt, sind daher veraltet. Für diese object-basierten Handles sollte man stattdessen get_class() / instanceof verwenden. Datei-Streams von fopen() sind noch immer echte Ressourcen, weshalb sie das verlässliche Beispiel bleiben.
Schutz vor Nicht-Ressourcen
Da das Übergeben einer Nicht-Ressource in PHP 8 einen TypeError auslöst, sollte man zunächst mit is_resource() prüfen, wenn der Wert möglicherweise geschlossen oder false sein könnte:
<?php
$file = fopen("php://memory", "r");
fclose($file);
if (is_resource($file)) {
echo get_resource_type($file);
} else {
echo "Not an active resource";
}
?>Ausgabe:
Not an active resourceNach fclose() wird die Variable zu einer geschlossenen Ressource: is_resource() gibt false zurück, und gettype() meldet "resource (closed)". Diese Absicherung verhindert einen fatalen TypeError.
Wann wird diese Funktion verwendet?
- Eingabe validieren in einer Funktion, die nur einen bestimmten Ressourcentyp akzeptieren soll (z. B. alles ablehnen, was kein
"stream"ist). - Debugging / Logging – festhalten, was eine Ressource tatsächlich ist, wenn man einem Fehler auf der Spur ist.
- Verzweigungslogik in Bibliotheken, die mehrere Ressourcentypen unterschiedlich behandeln.
Für eine einfache Prüfung „ist das überhaupt eine Ressource?" empfiehlt sich is_resource(); get_resource_type() kommt nur dann zum Einsatz, wenn unterschieden werden muss, welche Ressource es ist.
Fazit
get_resource_type() gibt einen string zurück, der beschreibt, welche Art von Ressource eine Variable enthält – nützlich für Validierung, Debugging und typspezifische Verzweigungen. Wichtig ist der PHP-8-Wechsel: Viele Handles, die früher Ressourcen waren (cURL, MySQLi, GD), sind jetzt Objekte und lösen einen TypeError aus – für diese sollte get_class() verwendet werden. Kombiniere get_resource_type() mit is_resource(), um die Funktion niemals auf einer geschlossenen oder ungültigen Ressource aufzurufen.