Die Funktion dirname() ist das Gegenstück zu basename(): Während basename() den Dateinamen liefert, gibt dirname() den Verzeichnispfad zurück. In der Praxis wird sie häufig gebraucht, um Dateien relativ zum aktuellen Skript einzubinden.
Grundlegende Verwendung
Die Funktion erwartet einen Pfad und gibt alles außer dem letzten Bestandteil zurück:
<?php
echo dirname('/var/www/html/index.php');
/* Ausgabe: /var/www/html */
echo dirname('/var/www/html/');
/* Ausgabe: /var/www */
echo dirname('config.php');
/* Ausgabe: . (aktuelles Verzeichnis) */
?>
Wenn der Pfad keinen Verzeichnistrenner enthält, gibt dirname() einen Punkt (.) zurück. Das steht für das aktuelle Verzeichnis. Ein Trailing-Slash am Ende wird vor der Auswertung entfernt.
Mehrere Ebenen mit dem levels-Parameter (PHP 7+)
Seit PHP 7.0 akzeptiert dirname() einen zweiten Parameter, der angibt, wie viele Verzeichnisebenen nach oben gegangen werden soll:
<?php
$pfad = '/var/www/html/projekt/public/index.php';
echo dirname($pfad, 1);
/* Ausgabe: /var/www/html/projekt/public */
echo dirname($pfad, 2);
/* Ausgabe: /var/www/html/projekt */
echo dirname($pfad, 3);
/* Ausgabe: /var/www/html */
?>
Das erspart verschachtelte Aufrufe wie dirname(dirname(dirname($pfad))), die früher nötig waren.
Praxisbeispiel: Dateien relativ einbinden
Ein typischer Anwendungsfall ist das Einbinden von Dateien relativ zum Speicherort des aktuellen Skripts. Dafür wird dirname() zusammen mit der magischen Konstante __FILE__ verwendet:
<?php
/* Konfiguration einbinden, egal von wo
das Skript aufgerufen wird */
$projektRoot = dirname(__FILE__, 2);
require $projektRoot . '/config.php';
require $projektRoot . '/src/functions.php';
?>
Durch dirname(__FILE__, 2) wird das Verzeichnis zwei Ebenen über dem aktuellen Skript ermittelt. So funktioniert der Include auch dann, wenn das Skript aus einem anderen Arbeitsverzeichnis heraus aufgerufen wird.
Die Alternative: __DIR__
Seit PHP 5.3 gibt es die magische Konstante __DIR__, die eine Kurzform für dirname(__FILE__) darstellt:
<?php
/* Beide Zeilen liefern das gleiche Ergebnis */
echo dirname(__FILE__);
echo __DIR__;
/* Fuer mehrere Ebenen nach oben: */
echo dirname(__DIR__, 2);
?>
In modernem PHP-Code wird __DIR__ bevorzugt, weil es kürzer und besser lesbar ist. Für mehrere Ebenen kann dirname(__DIR__, 2) verwendet werden.
dirname() vs. pathinfo()
Wer neben dem Verzeichnis auch den Dateinamen oder die Endung braucht, kann stattdessen pathinfo() verwenden. Diese Funktion liefert alle Bestandteile eines Pfades auf einmal:
<?php
$info = pathinfo('/var/www/html/bild.jpg');
echo $info['dirname']; // /var/www/html
echo $info['basename']; // bild.jpg
echo $info['extension']; // jpg
echo $info['filename']; // bild
?>
Für den Fall, dass nur das Verzeichnis gebraucht wird, bleibt dirname() die einfachere und performantere Wahl.