Signatur
Beschreibung
Die Klasse Directory wird nicht direkt über new Directory() instanziiert, sondern ausschließlich durch den Aufruf der Funktion dir(). Sie kapselt einen Verzeichnis-Handle und stellt zwei Methoden bereit: read() zum schrittweisen Auslesen von Einträgen sowie close() zum Freigeben des Handles.
Ein Directory-Objekt verhält sich funktional ähnlich wie die prozeduralen Funktionen opendir(), readdir() und closedir(), bietet aber eine sauberere, objektorientierte Schnittstelle. Die Eigenschaft path enthält den Pfad des geöffneten Verzeichnisses, während handle den zugrunde liegenden Ressource-Handle hält, der auch mit den prozeduralen Verzeichnisfunktionen verwendet werden kann.
Typische Anwendungsfälle sind das Iterieren über Verzeichnisinhalte, das Filtern von Dateien nach Erweiterung oder das Traversieren von Verzeichnisstrukturen. Für komplexere Traversierungen ist alternativ die Klasse RecursiveDirectoryIterator aus der SPL zu empfehlen.
Beispiele
Alle Einträge eines Verzeichnisses auflisten
<?php
$dir = dir('/var/www/html');
if ($dir === false) {
echo 'Verzeichnis konnte nicht geöffnet werden.';
exit;
}
echo 'Pfad: ' . $dir->path . PHP_EOL;
while (($entry = $dir->read()) !== false) {
echo $entry . PHP_EOL;
}
$dir->close();
Nur PHP-Dateien in einem Verzeichnis filtern
<?php
$dir = dir(__DIR__);
if ($dir === false) {
throw new RuntimeException('Verzeichnis konnte nicht geöffnet werden.');
}
$phpFiles = [];
while (($entry = $dir->read()) !== false) {
if (pathinfo($entry, PATHINFO_EXTENSION) === 'php') {
$phpFiles[] = $entry;
}
}
$dir->close();
echo 'PHP-Dateien gefunden: ' . count($phpFiles) . PHP_EOL;
foreach ($phpFiles as $file) {
echo ' - ' . $file . PHP_EOL;
}
Handle-Eigenschaft mit prozeduralen Funktionen kombinieren
<?php
$dir = dir('/tmp');
if ($dir === false) {
exit('Fehler beim Öffnen.');
}
// Handle kann auch mit prozeduralen Funktionen genutzt werden
rewinddir($dir->handle);
while (($entry = readdir($dir->handle)) !== false) {
if ($entry !== '.' && $entry !== '..') {
echo $entry . PHP_EOL;
}
}
$dir->close();
// Wichtig · Fallstricke
Instanziierung: Die Klasse Directory darf niemals mit new Directory() erzeugt werden — ausschließlich dir() liefert eine gültige Instanz. Bei einem Fehler gibt dir() false zurück, daher sollte stets eine Prüfung erfolgen.
Ressourcen freigeben: close() sollte immer aufgerufen werden, wenn das Verzeichnis nicht mehr benötigt wird, um den Datei-Handle zu schließen und Ressourcen freizugeben. Alternativ wird der Handle beim Zerstören des Objekts automatisch geschlossen.
Einträge . und ..: read() gibt auch die speziellen Einträge . (aktuelles Verzeichnis) und .. (übergeordnetes Verzeichnis) zurück. Diese müssen bei der Verarbeitung in der Regel explizit herausgefiltert werden.
Tipp: Für tiefere Verzeichnis-Traversierungen empfiehlt sich die SPL-Klasse RecursiveDirectoryIterator in Kombination mit RecursiveIteratorIterator.