Утилитарный класс для построения и манипуляции файловыми путями. Поддерживает как обычные пути файловой системы, так и URL-схемы (https://, ftp:// и т.д.).
Класс входит в состав пакета arris/entity. Подключается через автозагрузчик Composer:
use Arris\Entity\Path;// Создать путь из строки
$path = new Path('/var/www/html');
echo $path; // /var/www/html
// Создать через фабричный метод
$path = Path::create('uploads/images');
echo $path->toString(); // uploads/images
// Соединить с подпутём
$full = Path::create('/var/www')->join('html/index.php');
echo $full; // /var/www/html/index.php
// URL-адрес тоже работает
$url = new Path('https://cdn.example.com/assets/app.js');
echo $url; // https://cdn.example.com/assets/app.jsnew Path(string|array|Path $path, ?bool $isAbsolutePath = null, ?bool $hasTrailingSeparator = null)Принимает путь в одном из трёх форматов:
// Строка
$p = new Path('/foo/bar/baz');
// Массив сегментов
$p = new Path(['foo', 'bar', 'baz']);
// Другой экземпляр Path
$copy = new Path($existingPath);Автоопределение флагов из строки:
| Входная строка | isAbsolutePath |
hasTrailingSeparator |
|---|---|---|
/foo/bar |
true |
false |
foo/bar/ |
false |
true |
/foo/bar/ |
true |
true |
foo/bar |
false/null |
false |
| `` (пустая) | true |
null |
Множественные слэши автоматически схлопываются: foo//bar///baz → foo/bar/baz.
Path::create(string|array|Path $path, ?bool $isAbsolutePath = null, ?bool $hasTrailingSeparator = null): PathЭквивалентен конструктору, но удобнее для цепочек вызовов:
$path = Path::create('/var/www')
->setTrailingSeparator(true);Экспортирует путь в строку. Аргумент позволяет принудительно добавить завершающий разделитель:
$p = new Path('/var/www/html');
$p->toString(); // /var/www/html
$p->toString(true); // /var/www/html/Внимание: вызов
toString(true)мутирует внутренний флаг$hasTrailingSeparator.
Псевдоним toString() без аргументов. Позволяет использовать объект в строковом контексте:
echo new Path('/etc/nginx'); // /etc/nginxВозвращает новый экземпляр с добавленным сегментом. Наследует флаги isAbsolutePath и hasTrailingSeparator из текущего объекта.
$base = new Path('/var/www');
$full = $base->join('html');
echo $full; // /var/www/html
// Можно передать массив, строку или Path
$base->join(['assets', 'css']); // /var/www/assets/css
$base->join(new Path('logs')); // /var/www/logsАналог join(), но принудительно устанавливает hasTrailingSeparator = false. Удобно для добавления имени файла:
$dir = new Path('/var/www/');
$file = $dir->joinName('index.php');
echo $file; // /var/www/index.phpВсе методы мутируют текущий объект и возвращают $this для цепочек вызовов.
$path = new Path('foo/bar');
$path->setAbsolutePath(true);
echo $path; // /foo/bar$path = new Path('/var/www');
$path->setTrailingSeparator(true);
echo $path->toString(true); // /var/www/Устанавливает сразу несколько флагов. Поддерживает ключи isAbsolute и hasTrailingSeparator:
$path->setOptions([
'isAbsolute' => true,
'hasTrailingSeparator' => false,
]);Неизвестные ключи игнорируются. Значение
nullтакже игнорируется (ключ должен присутствовать с непустым значением).
Возвращает true, если по данному пути существует директория.
if ((new Path('/var/log'))->isPresent()) { /* ... */ }Возвращает true, если путь указывает на существующий читаемый файл.
if ((new Path('/etc/hosts'))->isFile()) { /* ... */ }Создаёт директорию рекурсивно (аналог mkdir -p). Возвращает true при успехе или если директория уже существует.
$created = (new Path('/tmp/app/cache'))->makePath(0755);| Свойство | Тип | Описание |
|---|---|---|
$atoms |
array |
Массив сегментов пути (['var', 'www', 'html']) |
$isAbsolutePath |
?bool |
Путь начинается с / |
$hasTrailingSeparator |
?bool |
Путь заканчивается на / |
Класс содержит внутренний механизм («костыль») для работы с URL-схемами: :// при разборе заменяется на :||, а при экспорте возвращается обратно. Это позволяет использовать Path для сборки URL, хотя для полноценной работы с URL рекомендуется использовать специализированный класс.
$url = new Path('https://example.com/api/v1');
echo $url; // https://example.com/api/v1
// Двойной слэш в пути (не в схеме) схлопывается
$url = new Path('https://cdn.example.com/a//b');
echo $url; // https://cdn.example.com/a/b- PHP 8.2+
- Реализует интерфейс
PathInterface - Разделитель сегментов:
DIRECTORY_SEPARATOR(на Unix —/, на Windows —\)
toString(true)мутирует объект — флагhasTrailingSeparatorизменяется внутри. Если нужно неизменяемое поведение, используйтеPath::create($this)->toString(true).- Сегмент
.(точка) превращается во внутренний пустой атом''. При экспорте двойной разделитель схлопывается — итоговая строка остаётся корректной. - Пустой атом (
'') в середине массива сегментов при проходе черезvalidateAtomне добавляется в$atoms.
MIT