is_file()
Die Funktion is_file() in PHP prüft, ob ein Pfad eine reguläre Datei ist, und gibt true zurück, wenn dies der Fall ist.
Was ist die Funktion is_file()?
is_file() ist eine eingebaute PHP-Funktion, die angibt, ob ein Pfad auf eine reguläre Datei zeigt — eine gewöhnliche Datei auf dem Datenträger, im Gegensatz zu einem Verzeichnis, dem Zieltyp eines symbolischen Links oder einer Sonderdatei (Pipe, Socket oder Geräteknoten). Sie gibt true nur für reguläre Dateien zurück und false für alles andere, einschließlich Pfade, die nicht existieren.
Diese Funktion verwendet man, bevor man versucht, eine Datei zu lesen, einzubinden oder zu verarbeiten, wenn „zeigt dieser Pfad tatsächlich auf eine Datei, mit der ich arbeiten kann?" wichtiger ist als „existiert dieser Pfad überhaupt?".
Syntax
is_file(string $filename): bool$filename— der zu prüfende Pfad. Er kann relativ (aufgelöst gegen das aktuelle Arbeitsverzeichnis) oder absolut sein.- Rückgabewert —
true, wenn$filenameexistiert und eine reguläre Datei ist, andernfallsfalse. Es wird keine Warnung ausgegeben, wenn die Datei fehlt; man erhält einfachfalse.
Einfaches Beispiel
Mit __FILE__ (dem absoluten Pfad des aktuellen Skripts) ist sichergestellt, dass die Prüfung erfolgreich ist, sodass das Skript eine Meldung ausgibt, die bestätigt, dass der Pfad eine reguläre Datei ist. Tauschen Sie einen beliebigen Pfad ein — ein fehlender Pfad oder ein Verzeichnis gibt false zurück.
is_file() vs. file_exists() vs. is_dir()
Diese drei Funktionen überschneiden sich, und die falsche Wahl ist eine häufige Fehlerquelle:
| Funktion | Gibt true zurück für |
|---|---|
is_file() | nur reguläre Dateien |
file_exists() | Dateien und Verzeichnisse |
is_dir() | nur Verzeichnisse |
Die häufige Falle: file_exists('/some/folder') ist true für ein Verzeichnis. Wenn man dann versucht, es mit fopen() zu öffnen oder mit include einzubinden, erhält man einen Fehler. Verwenden Sie is_file(), wenn der nächste Schritt eine echte Datei erwartet:
<?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 directoryEinen Dateilesezugriff absichern
Ein typischer Praxisanwendungsfall: Bestätigen Sie, dass der Pfad eine nutzbare Datei ist, bevor Sie sie lesen. Die Kombination von is_file() mit is_readable() vermeidet sowohl „keine Datei"- als auch „keine Berechtigung"-Fehler:
<?php
$path = __FILE__;
if (is_file($path) && is_readable($path)) {
echo "Safe to read: " . basename($path);
} else {
echo "Cannot read that path.";
}Dies gibt eine Ausgabe wie Safe to read: is-file.mdx aus (den Basisnamen des laufenden Skripts) und bricht sauber ab, wenn der Pfad ein Verzeichnis ist, fehlt oder nicht lesbar ist.
Die stat-Cache-Falle
PHP speichert die Ergebnisse von Dateisystemprüfungen wie is_file() für die Dauer einer Anfrage zwischen, um wiederholte Festplattenzugriffe zu vermeiden. Wenn eine Datei nachdem PHP denselben Pfad bereits geprüft hat erstellt oder gelöscht wird, kann ein zweiter is_file()-Aufruf die veraltete, gecachte Antwort zurückgeben. Wenn Sie ein aktuelles Ergebnis benötigen — zum Beispiel in einem langläufigen Skript, das eine Datei erstellt und sie sofort erneut prüft — leeren Sie den Cache zuerst:
<?php
clearstatcache(); // discard cached stat results
var_dump(is_file($path)); // now reflects the current state on diskHäufige Fallstricke
- Es ist keine Sicherheitsprüfung. Ein Pfad kann
is_file()bestehen und trotzdem nicht les- oder schreibbar sein. Kombinieren Sie es mitis_readable()oderis_writable(), bevor Sie handeln. - Symbolische Links werden aufgelöst.
is_file()prüft das Ziel eines Symlinks, nicht den Link selbst. Ein Symlink, der auf eine reguläre Datei zeigt, gibttruezurück. - Keine Warnung bei fehlenden Pfaden. Im Gegensatz zum Öffnen einer Datei gibt ein nicht existierender Pfad einfach
falsezurück, sodassis_file()sicher ohne Fehlerunterdrückung aufgerufen werden kann.
Fazit
is_file() beantwortet eine präzise Frage — „ist dies eine reguläre Datei?" — und ist die richtige Prüfung vor jedem Code, der eine Datei liest, einbindet oder verarbeitet. Greifen Sie auf file_exists() zurück, wenn auch ein Verzeichnis akzeptabel wäre, auf is_dir(), wenn Sie gezielt einen Ordner suchen, und kombinieren Sie is_file() mit den oben genannten Lesbarkeitssprüfungen, wenn Berechtigungen eine Rolle spielen.