pathinfo()
Функция pathinfo() в PHP разбивает путь к файлу на части — директорию, имя и расширение — и возвращает их в виде ассоциативного массива.
Что такое функция pathinfo()?
Функция pathinfo() — это встроенная функция PHP, которая разбивает путь к файлу на составные части — директорию, имя файла и расширение — и возвращает их в виде ассоциативного массива. Это незаменимый инструмент, когда нужно ответить на вопросы вроде «в какой папке находится этот файл?» или «какое расширение у загруженного файла?» — без написания собственного разбора строк.
Важно понимать с самого начала: pathinfo() работает исключительно со строкой, которую вы ей передаёте. Она никогда не обращается к файловой системе, поэтому путь не обязательно должен указывать на реально существующий файл. Это делает её быстрой и безопасной при работе с пользовательскими значениями (например, с оригинальным именем загружаемого файла).
На этой странице рассматриваются синтаксис, возвращаемый массив, способы запросить отдельный компонент и граничные случаи, которые часто вызывают путаницу (отсутствие расширения, скрытые файлы, составные расширения).
Синтаксис
pathinfo(string $path, int $flags = PATHINFO_ALL): array|string$path— путь к файлу для анализа. Может быть абсолютным или относительным и не обязан существовать.$flags— необязательный параметр. Если не указан (или равенPATHINFO_ALL), функция возвращает ассоциативный массив. При указании одного флага возвращается только соответствующий компонент в виде строки.
Массив, возвращаемый pathinfo()
По умолчанию pathinfo() возвращает ассоциативный массив с четырьмя ключами:
| Ключ | Значение | Пример для /var/www/html/index.php |
|---|---|---|
dirname | Директория | /var/www/html |
basename | Полное имя файла с расширением | index.php |
extension | Расширение (без точки) | php |
filename | Имя файла без расширения | index |
Здесь мы передаём путь к файлу и сохраняем результирующий массив в $info, затем обращаемся к каждому компоненту по его ключу.
Важно: ключ
extensionприсутствует только тогда, когда путь содержит точку. Если расширения нет, этот ключ просто отсутствует в массиве, и прямое обращение к$info['extension']вызовет предупреждение «Undefined array key». Используйте$info['extension'] ?? ''при необходимости.
Получение отдельного компонента
Если нужна только одна часть пути, передайте флаг вторым аргументом. Доступные флаги: PATHINFO_DIRNAME, PATHINFO_BASENAME, PATHINFO_EXTENSION и PATHINFO_FILENAME. При указании одного флага функция возвращает строку вместо массива:
Это наиболее удобный способ получить только расширение — например, чтобы проверить, что загружаемый файл имеет допустимый тип.
Граничные случаи
pathinfo() достаточно терпима, но некоторые результаты могут удивить:
<?php
// 1. No extension: the 'extension' key is missing entirely.
print_r(pathinfo('/etc/hosts'));
// Array ( [dirname] => /etc [basename] => hosts [filename] => hosts )
// 2. Multi-part extension: only the LAST part counts as the extension.
print_r(pathinfo('archive.tar.gz'));
// Array ( [dirname] => . [basename] => archive.tar.gz
// [extension] => gz [filename] => archive.tar )
// 3. Dotfile: the leading dot makes the whole name the "extension".
print_r(pathinfo('/home/user/.bashrc'));
// Array ( [dirname] => /home/user [basename] => .bashrc
// [extension] => bashrc [filename] => )Примечания:
- Путь без директории (случай 2) возвращает
dirnameкак.(текущая директория). - Для имён вида
.tar.gzфункцияpathinfo()считает расширением толькоgz— встроенного способа получитьtar.gzза один вызов не существует. - Скрытый файл вроде
.bashrcинтерпретируется как «файл без имени с расширениемbashrc», что в большинстве случаев нежелательно. Обрабатывайте такие случаи самостоятельно, если ваш код допускает подобные пути.
Когда использовать pathinfo()
Используйте pathinfo(), когда нужно получить сразу несколько частей пути или когда вы хотите иметь понятный именованный массив вместо нескольких отдельных функций:
- Используйте
pathinfo($p), чтобы получить директорию, имя и расширение вместе. - Используйте basename(), если нужно только имя файла — эта функция также позволяет удалить известный суффикс.
- Используйте dirname(), если нужна только директория; аргумент
$levelsпозволяет подняться на несколько уровней. - Используйте realpath(), когда нужно разрешить путь относительно реальной файловой системы (символические ссылки,
..и т.д.) — в отличие отpathinfo(), эта функция обращается к диску и возвращаетfalseдля несуществующих файлов.
Для общего обзора чтения и записи файлов смотрите Работа с файлами в PHP.
Заключение
pathinfo() — это самый быстрый способ разбить путь к файлу на директорию, базовое имя, расширение и имя без расширения. Помните, что функция только разбирает строку (она никогда не проверяет существование файла), что ключ extension отсутствует при отсутствии расширения, и что для имён вида archive.tar.gz возвращается только последнее расширение. При необходимости получить один компонент удобнее использовать специализированные функции basename() и dirname().