W3docs

is_resource()

La fonction is_resource() vérifie si une variable est une ressource PHP ouverte ou non. Découvrez sa syntaxe, son comportement et les changements PHP 8.

Introduction

is_resource() est une fonction PHP native qui vérifie si une variable contient une ressource. Une ressource est un type PHP spécial qui agit comme un descripteur vers quelque chose vivant en dehors de PHP lui-même — un fichier ouvert, une connexion à une base de données, un socket réseau ou une image en cours de construction en mémoire. Vous ne pouvez pas inspecter directement la valeur d'une ressource comme vous le feriez avec une string ou un array ; vous pouvez seulement la passer aux fonctions qui savent l'utiliser (fread(), fclose(), etc.).

is_resource() retourne true lorsque la variable est une ressource ouverte et false pour tout autre type, y compris une ressource déjà fermée. Cette page couvre la syntaxe, le comportement à l'exécution, le changement important de PHP 8 à connaître, et la relation avec les autres fonctions de vérification de type.

Syntaxe

is_resource(mixed $value): bool

Elle prend un seul argument — la variable à tester — et retourne un boolean. Elle ne lève jamais d'exception et ne modifie jamais son argument, il est donc sûr de l'appeler sur n'importe quoi.

Exemple d'utilisation

Un descripteur de fichier retourné par fopen() est la ressource la plus courante que vous rencontrerez :

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

Utilisez var_dump() plutôt que echo ici : un true s'affiche en 1, mais un false s'affiche en string vide, ce qui peut être mal interprété. var_dump() affiche le type et la valeur sans ambiguïté.

Une ressource fermée n'est plus une ressource

C'est le piège qui surprend les développeurs. Une fois que vous fermez un descripteur, is_resource() retourne false pour celui-ci — il ne reste pas true. Cela fait de la fonction un garde pratique contre l'utilisation d'un descripteur deux fois :

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

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

Protéger avec is_resource() avant un fwrite() ou un second fclose() évite les avertissements « supplied resource is not a valid stream resource ».

Le changement PHP 8 : de nombreuses ressources sont maintenant des objets

En PHP 8.0, un grand nombre d'extensions natives ont été migrées des ressources vers des objets opaques. Les descripteurs Curl, les images GD, et plusieurs autres anciennes ressources sont maintenant des objets, donc is_resource() retourne false pour eux même s'ils se comportent conceptuellement de la même façon :

<?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 vous maintenez du code qui s'exécute à la fois sur PHP 7 et PHP 8, ne supposez pas qu'un descripteur curl ou GD est une ressource. Vérifiez le type spécifique que vous attendez, ou acceptez les deux avec is_resource($x) || is_object($x).

Identifier le type de ressource

Lorsque is_resource() est true, get_resource_type() vous indique de quel type il s'agit — "stream" pour les fichiers, "curl" sur PHP 7, "gd" pour les images, etc. :

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

Quand l'utiliser ?

  • Gardes défensifs. Avant d'appeler fread(), fwrite() ou fclose() sur une valeur que vous n'avez pas créée vous-même, confirmez qu'il s'agit encore d'une ressource ouverte.
  • Fonctions acceptant « un descripteur ou un chemin ». Un helper peut accepter soit une string de nom de fichier, soit un descripteur déjà ouvert ; is_resource() vous permet de déterminer lequel vous avez reçu.
  • Logique de nettoyage. Dans un bloc finally ou un destructeur, if (is_resource($h)) fclose($h); évite de fermer un descripteur deux fois.

Fonctions associées

is_resource() fait partie de la famille des prédicats de vérification de type de PHP. Pour d'autres types, utilisez is_object(), is_array() ou is_string(). Si vous souhaitez le nom du type sous forme de string plutôt qu'un test boolean, utilisez gettype(), qui retourne "resource" (ou "resource (closed)") pour les descripteurs.

Conclusion

is_resource() confirme qu'une variable est un descripteur ouvert vers une ressource externe, retournant false pour les descripteurs fermés et pour tout autre type. La chose importante à retenir dans le PHP moderne est que depuis PHP 8, de nombreuses anciennes ressources — les descripteurs curl et GD notamment — sont des objets, donc testez avec is_object() (ou vérifiez les deux) lorsque votre code cible PHP 8+.

Pratique

Pratique
Quelle est la fonctionnalité de la fonction is_resource() en PHP ?
Quelle est la fonctionnalité de la fonction is_resource() en PHP ?
Was this page helpful?