W3docs

is_resource()

Die Funktion is_resource() in PHP prüft, ob eine Variable eine Ressource ist – z. B. ein offenes Datei-Handle oder eine Datenbankverbindung.

Einführung

is_resource() ist eine eingebaute PHP-Funktion, die prüft, ob eine Variable eine Ressource enthält. Eine Ressource ist ein spezieller PHP-Typ, der als Handle für etwas dient, das außerhalb von PHP selbst existiert — eine geöffnete Datei, eine Datenbankverbindung, einen Netzwerk-Socket oder ein Bild, das gerade im Speicher aufgebaut wird. Den Wert einer Ressource kann man nicht direkt inspizieren wie bei einem string oder einem array; man kann sie nur an die Funktionen übergeben, die wissen, wie man damit umgeht (fread(), fclose() und so weiter).

is_resource() gibt true zurück, wenn die Variable eine offene Ressource ist, und false für jeden anderen Typ, einschließlich einer Ressource, die bereits geschlossen wurde. Diese Seite behandelt die Syntax, das Laufzeitverhalten, die wichtige PHP-8-Änderung, die Sie kennen sollten, und den Zusammenhang mit den anderen Typprüfungsfunktionen.

Syntax

is_resource(mixed $value): bool

Die Funktion nimmt ein einziges Argument entgegen — die zu prüfende Variable — und gibt einen boolean zurück. Sie wirft nie eine Ausnahme und verändert ihr Argument nicht, sodass sie sicher auf beliebige Werte angewendet werden kann.

Beispielanwendung

Ein von fopen() zurückgegebenes Datei-Handle ist die häufigste Ressource, der man begegnet:

<?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);
?>

Verwenden Sie var_dump() statt echo: Ein true wird als 1 ausgegeben, aber ein false als leere Zeichenkette, was leicht missverstanden werden kann. var_dump() gibt Typ und Wert eindeutig aus.

Eine geschlossene Ressource ist keine Ressource mehr

Das ist die Falle, in die viele tappen. Sobald ein Handle geschlossen wird, gibt is_resource() dafür false zurück — es bleibt nicht true. Damit eignet sich die Funktion als praktischer Schutz davor, ein Handle zweimal zu verwenden:

<?php
$handle = fopen("php://temp", "w");
var_dump(is_resource($handle)); // bool(true)

fclose($handle);
var_dump(is_resource($handle)); // bool(false) — already closed
?>

Ein Schutz mit is_resource() vor einem fwrite() oder einem zweiten fclose() verhindert die Warnmeldung „supplied resource is not a valid stream resource".

Die PHP-8-Änderung: Viele Ressourcen sind jetzt Objekte

In PHP 8.0 wurden viele eingebaute Erweiterungen von Ressourcen auf opake Objekte umgestellt. Curl-Handles, GD-Images und mehrere andere frühere Ressourcen sind jetzt Objekte, sodass is_resource() für sie false zurückgibt, obwohl sie sich konzeptuell genauso verhalten:

<?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+
?>

Wenn Sie Code pflegen, der sowohl unter PHP 7 als auch unter PHP 8 läuft, dürfen Sie nicht davon ausgehen, dass ein Curl- oder GD-Handle eine Ressource ist. Prüfen Sie den spezifischen Typ, den Sie erwarten, oder akzeptieren Sie beide mit is_resource($x) || is_object($x).

Herausfinden, um welche Art von Ressource es sich handelt

Wenn is_resource() true ergibt, verrät get_resource_type(), um welchen Typ es sich handelt — "stream" für Dateien, "curl" unter PHP 7, "gd" für Bilder und so weiter:

<?php
$handle = fopen("php://temp", "r");
echo get_resource_type($handle), "\n"; // stream
fclose($handle);
?>

Wann würde ich sie verwenden?

  • Defensive Absicherung. Bevor Sie fread(), fwrite() oder fclose() auf einem Wert aufrufen, den Sie nicht selbst erstellt haben, bestätigen Sie, dass es sich noch um eine offene Ressource handelt.
  • Funktionen, die „ein Handle oder einen Pfad" akzeptieren. Ein Hilfsprogramm könnte entweder einen Dateinamen-string oder ein bereits geöffnetes Handle entgegennehmen; is_resource() ermöglicht die Verzweigung je nachdem, was übergeben wurde.
  • Aufräumlogik. In einem finally-Block oder Destruktor vermeidet if (is_resource($h)) fclose($h); das doppelte Schließen eines Handles.

Verwandte Funktionen

is_resource() gehört zur Familie der Typprüfungs-Prädikate in PHP. Für andere Typen verwenden Sie is_object(), is_array() oder is_string(). Wenn Sie den Typnamen als string statt als boolean-Test möchten, nutzen Sie gettype(), das für Handles "resource" (oder "resource (closed)") zurückgibt.

Fazit

is_resource() bestätigt, dass eine Variable ein offenes Handle zu einer externen Ressource ist, und gibt false für geschlossene Handles und für jeden anderen Typ zurück. Das Wichtigste für modernes PHP: Seit PHP 8 sind viele frühere Ressourcen — darunter Curl- und GD-Handles — Objekte, also prüfen Sie mit is_object() (oder prüfen Sie beides), wenn Ihr Code auf PHP 8+ abzielt.

Übung

Übung
Was ist die Funktionalität der Funktion is_resource() in PHP?
Was ist die Funktionalität der Funktion is_resource() in PHP?
Was this page helpful?