W3docs

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
php— editable, runs on the server

Здесь мы передаём путь к файлу и сохраняем результирующий массив в $info, затем обращаемся к каждому компоненту по его ключу.

Важно: ключ extension присутствует только тогда, когда путь содержит точку. Если расширения нет, этот ключ просто отсутствует в массиве, и прямое обращение к $info['extension'] вызовет предупреждение «Undefined array key». Используйте $info['extension'] ?? '' при необходимости.

Получение отдельного компонента

Если нужна только одна часть пути, передайте флаг вторым аргументом. Доступные флаги: PATHINFO_DIRNAME, PATHINFO_BASENAME, PATHINFO_EXTENSION и PATHINFO_FILENAME. При указании одного флага функция возвращает строку вместо массива:

php— editable, runs on the server

Это наиболее удобный способ получить только расширение — например, чтобы проверить, что загружаемый файл имеет допустимый тип.

Граничные случаи

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().

Практика

Практика
Какова цель функции pathinfo() в PHP?
Какова цель функции pathinfo() в PHP?
Was this page helpful?