dirname()
Функция dirname() в PHP возвращает родительский каталог из заданного пути. Незаменима для работы с файловой системой.
Функция PHP dirname()
Функция dirname() возвращает часть пути, соответствующую родительскому каталогу. Получив полный путь к файлу или директории, она отсекает последний компонент и возвращает каталог, в котором он содержится. На этой странице описаны синтаксис, параметр $levels, граничные случаи и отличия dirname() от связанных функций работы с путями.
Это исключительно строковая операция: dirname() разбирает текст переданного пути. Она не обращается к файловой системе, поэтому путь не обязан указывать на реально существующий файл.
Синтаксис
dirname(string $path, int $levels = 1): string$path— путь, с которым выполняется операция (обязательный).$levels— количество уровней каталогов, на которое нужно подняться вверх. По умолчанию равно1. Доступен начиная с PHP 7.0; должен быть не менее1.
Функция возвращает родительский каталог $path в виде string.
Параметры
| Параметр | Обязателен | Описание |
|---|---|---|
$path | Да | Строка пути. Не обязана указывать на существующий файл или каталог — dirname() анализирует только текст. |
$levels | Нет | Количество уровней для подъёма вверх. dirname($path, 2) эквивалентно dirname(dirname($path)). По умолчанию 1. |
Примеры
Получить каталог файла
Следующий код извлекает каталог, содержащий example.txt:
Вывод:
/home/user1Получить родительский каталог директории
Завершающий слеш воспринимается как конец имени каталога, поэтому dirname() всё равно возвращает родительский каталог:
Вывод:
/home/user1Подъём на несколько уровней с помощью $levels
Передайте второй аргумент, чтобы подняться выше по дереву за один вызов:
<?php
echo dirname("/usr/local/lib", 2);Вывод:
/usrЭто эквивалентно dirname(dirname("/usr/local/lib")), но читается чище, когда нужно подняться на несколько уровней.
Граничные случаи
dirname() имеет несколько результатов, которые поначалу удивляют:
<?php
echo dirname("example.txt"), "\n"; // "." — no directory part, so current dir
echo dirname("/"), "\n"; // "/" — root has no parent
echo dirname(""), "\n"; // "."- Путь без компонента каталога возвращает
.(текущий каталог), а не пустую строку. - Корневой путь возвращает сам себя.
- В Windows в качестве разделителей каталогов принимаются как
/, так и\.
dirname() и связанные функции
basename()— противоположностьdirname(): возвращает последний компонент пути (имя файла или папки) вместо родительского каталога.pathinfo()— возвращает массив сdirname,basename,extensionиfilenameодновременно, что удобно, когда нужно получить сразу несколько частей пути.realpath()— разрешает путь относительно реальной файловой системы (следуя символическим ссылкам и..), в отличие отdirname(), которая работает только со строкой.
Распространённый шаблон — построение путей относительно текущего файла:
<?php
// Load config that sits one directory above this script.
require dirname(__DIR__) . "/config.php";Заключение
dirname() извлекает родительский каталог из пути как простую строковую операцию. Помните, что она никогда не обращается к файловой системе, что путь без каталога возвращает . и что аргумент $levels позволяет подняться на несколько уровней за один вызов. Для получения компонента имени файла используйте basename(); для получения всего сразу — pathinfo().