В этом курсе мы создадим виртуальную (не настоящую) файловую систему и реализуем повседневные операции для работы с ней: подсчет свободного места, поиск файлов и директорий и т.п. Вот как выглядит создание этого дерева:
<?php
use function Php\Immutable\Fs\Trees\trees\mkdir;
use function Php\Immutable\Fs\Trees\trees\mkfile;
// mkdir вторым параметром принимает список детей
// которые могут быть либо директориями созданными mkdir
// либо файлами созданными mkfile
$tree = mkdir('etc', [
mkfile('bashrc'),
mkdir('consul', [
mkfile('config.json'),
]),
], ['key' => 'value']);
В результате получается такая структура:
etc
├── bashrc
└── consul
└── config.json
Вкладывая вызовы mkdir
и mkfile
в другие mkdir
, можно получить любую файловую структуру. Корнем в этой структуре будет директория, а в листьях могут оказаться как файлы, так и пустые директории.
Эта структура виртуальная, то есть реального создания файлов и директорий не происходит. Вся информация о файловой системе находится в переменной tree
. Если ее распечатать на экран, то мы увидим следующее содержимое:
<?php
[
'name' => 'etc',
'type' => 'directory',
'meta' => ['key' => 'value'],
'children' => [
[
'name' => 'bashrc',
'type' => 'file',
'meta' => [],
],
[
'name' => 'consul',
'type' => 'directory',
'meta' => [],
'children' => [
[
'name' => 'config.json',
'type' => 'file',
'meta' => [],
]
],
],
],
];
Это внутренняя реализация файлового дерева. Она состоит из двух типов узлов: директорий и файлов.
Представление директории:
<?php
[
'name' => /* ... */,
'type' => 'directory',
'meta' => [], // Свойства директории
'children' => [/* ... */], // Здесь хранятся дети
];
Представление файла:
<?php
[
'name' => /* ... */,
'type' => 'file',
'meta' => [], // Свойства файла
];
У файлов и директорий есть имена, это общая часть. Свойство type
определяет тип ноды и с его помощью можно понять что перед нами во время обработки этого дерева. meta
— объект с произвольными данными, например, размером, датой создания и так далее. Свойства задаются во время создания узлов:
<?php
mkfile('.bashrc', ['size' => 75]);
mkdir('hexlet', [/* дети */], ['owner' => 'nobody']);
Метаданные понадобятся функциям, которые анализируют дерево, например считают занятое место.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.