is_file()
La fonction is_file() de PHP vérifie si un chemin correspond à un fichier ordinaire. Elle retourne true pour les fichiers réguliers, false sinon.
Qu'est-ce que la fonction is_file() ?
is_file() est une fonction PHP intégrée qui indique si un chemin pointe vers un fichier ordinaire — un fichier standard sur le disque, par opposition à un répertoire, au type de cible d'un lien symbolique, ou à un fichier spécial (tube, socket ou nœud de périphérique). Elle retourne true uniquement pour les fichiers ordinaires et false pour tout le reste, y compris les chemins qui n'existent pas.
C'est la fonction à utiliser avant de tenter de lire, d'inclure ou de traiter un fichier, lorsque la question « ce chemin pointe-t-il réellement vers un fichier utilisable ? » importe plus que « ce chemin existe-t-il tout simplement ? ».
Syntaxe
is_file(string $filename): bool$filename— le chemin à vérifier. Il peut être relatif (résolu par rapport au répertoire de travail courant) ou absolu.- Valeur de retour —
truesi$filenameexiste et est un fichier ordinaire,falsesinon. Aucun avertissement n'est émis si le fichier est absent ; on obtient simplementfalse.
Exemple de base
L'utilisation de __FILE__ (le chemin absolu du script en cours d'exécution) garantit que la vérification réussit, de sorte que le script affiche un message confirmant que le chemin est un fichier ordinaire. Remplacez par n'importe quel autre chemin — un chemin inexistant ou un répertoire retourne false.
is_file() vs file_exists() vs is_dir()
Ces trois fonctions se chevauchent, et choisir la mauvaise est une source fréquente de bogues :
| Fonction | Retourne true pour |
|---|---|
is_file() | les fichiers ordinaires uniquement |
file_exists() | les fichiers et les répertoires |
is_dir() | les répertoires uniquement |
Le piège principal : file_exists('/some/folder') est true pour un répertoire. Si vous tentez ensuite d'utiliser fopen() ou include dessus en tant que fichier, vous obtenez une erreur. Utilisez is_file() chaque fois que l'étape suivante suppose un fichier réel :
<?php
$path = sys_get_temp_dir(); // a directory that definitely exists
var_dump(file_exists($path)); // bool(true) — it exists
var_dump(is_file($path)); // bool(false) — but it is NOT a file
var_dump(is_dir($path)); // bool(true) — it is a directoryProtéger une lecture de fichier
Un usage typique en production : vérifier que le chemin est un fichier utilisable avant de le lire. Combiner is_file() avec is_readable() permet d'éviter à la fois les erreurs « n'est pas un fichier » et « pas de permission » :
<?php
$path = __FILE__;
if (is_file($path) && is_readable($path)) {
echo "Safe to read: " . basename($path);
} else {
echo "Cannot read that path.";
}Ce code affiche un résultat du style Safe to read: is-file.mdx (le nom de base du script en cours d'exécution), et court-circuite proprement si le chemin est un répertoire, est absent ou n'est pas lisible.
Le piège du cache stat
PHP met en cache les résultats des vérifications du système de fichiers comme is_file() pendant la durée d'une requête afin d'éviter des accès répétés au disque. Si un fichier est créé ou supprimé après que PHP a déjà vérifié le même chemin, un second appel à is_file() peut retourner la réponse périmée mise en cache. Lorsqu'un résultat récent est nécessaire — par exemple dans un script à longue durée de vie qui crée un fichier et le re-vérifie immédiatement — videz d'abord le cache :
<?php
clearstatcache(); // discard cached stat results
var_dump(is_file($path)); // now reflects the current state on diskPièges courants
- Ce n'est pas une vérification de sécurité. Un chemin peut passer
is_file()tout en étant illisible ou non inscriptible. Combinez-le avecis_readable()ouis_writable()avant d'agir. - Les liens symboliques sont suivis.
is_file()vérifie la cible d'un lien symbolique, et non le lien lui-même. Un lien symbolique pointant vers un fichier ordinaire retournetrue. - Aucun avertissement pour les chemins inexistants. Contrairement à l'ouverture d'un fichier, un chemin inexistant retourne simplement
false, doncis_file()peut être appelé sans supprimer les erreurs.
Conclusion
is_file() répond à une question précise — « est-ce un fichier ordinaire ? » — et constitue le bon garde-fou à placer devant tout code qui lit, inclut ou traite un fichier. Utilisez file_exists() lorsqu'un répertoire serait également acceptable, is_dir() lorsque vous souhaitez spécifiquement un dossier, et combinez is_file() avec les vérifications de lisibilité ci-dessus lorsque les permissions sont importantes.