Dirname: примеры (PHP)

Использование dirname для работы с путями файлов в PHP
Раздел: Работа с файловой системой
dirname(string $path, int $levels = 1): string

Функция dirname() в PHP возвращает родительскую директорию заданного пути. Она используется для извлечения части пути, исключая последний компонент, что удобно при работе с файловыми системами и путями.

Аргументы функции
  • path (string) – обязательный параметр, задающий путь для обработки.
  • levels (int) – необязательный параметр, определяющий количество уровней директорий для подъёма вверх. По умолчанию равен 1. Добавлен в PHP 7.0.
Базовые примеры использования
Один уровень
<?php
echo dirname('/var/www/html/index.php');
?>
/var/www/html
Несколько уровней (аргумент levels)
<?php
echo dirname('/var/www/html/index.php', 2);
?>
/var/www
Обработка путей с точкой и слешом
<?php
echo dirname('script.php');
echo dirname('/');
?>
.
/

В PHP существуют другие функции для работы с путями:

  • basename() – возвращает конечный компонент пути, противоположность dirname().
  • pathinfo() – возвращает массив с информацией о пути (dirname, basename, extension, filename). Удобна для комплексного разбора пути.
  • realpath() – возвращает абсолютный канонизированный путь, убирая символьные ссылки и компоненты вроде '../'.

dirname() предпочтительнее, когда нужно быстро получить родительскую директорию без разбора других компонентов пути.

Распространённые ошибки
Ожидание конечного слеша

Функция не добавляет конечный слеш к результату.

<?php
$dir = dirname('/var/www/html/');
echo $dir === '/var/www' ? 'true' : 'false';
?>
true
Неверное количество уровней

Если уровней больше, чем компонентов пути, возвращается '.' или '/' в зависимости от платформы.

<?php
echo dirname('/usr/bin', 5);
?>
.

В PHP 7.0 добавлен необязательный второй аргумент levels, позволяющий подняться на несколько уровней вверх за один вызов. В PHP 8.0 изменений в поведении функции не было.

Определение директории текущего файла
Пример php
<?php
// В файле /var/www/project/include/config.php
echo dirname(__FILE__);
?>
/var/www/project/include
Построение относительных путей
Пример php
<?php
$path = 'images/avatars/user.jpg';
$uploadDir = dirname($path) . '/processed/';
echo $uploadDir;
?>
images/avatars/processed/
Обработка путей Windows
Пример php
<?php
echo dirname('C:\\Windows\\System32\\cmd.exe');
?>
C:\Windows\System32
Использование с реальными путями
Пример php
<?php
$absolute = dirname(realpath('index.php'));
echo $absolute;
?>
/home/user/public_html
Рекурсивное создание структуры каталогов
Пример php
<?php
function createParentDirs($filePath) {
    $dir = dirname($filePath);
    if (!is_dir($dir)) {
        mkdir($dir, 0777, true);
    }
}
createParentDirs('cache/2024/05/10/data.json');
echo 'Директории созданы';
?>
Директории созданы

Dirname в Python

Модуль os.path содержит функцию dirname(), аналогичную PHP. Также есть Path.parent в модуле pathlib.

from os.path import dirname
print(dirname('/var/www/html/index.php'))
/var/www/html
JavaScript (Node.js)

В Node.js используется модуль path и метод dirname().

const path = require('path');
console.log(path.dirname('/var/www/html/index.js'));
/var/www/html

Dirname в MySQL

Функция SUBSTRING_INDEX() может использоваться для эмуляции, но стандартной функции нет.

SELECT SUBSTRING_INDEX('/var/www/html/index.php', '/', -2);
html/index.php

PHP dirname function comments

En
Dirname Returns a parent directory's path