Фон
Мне нужно разработать набор служебных классов, которые облегчат доступ файловой системы к нескольким типам удаленных служб (локальный, FTP, WebDAV, SVN, SSH), и я не могу получить «идеальный» дизайн в основном из-за языка барьер - я чувствую, что все пути проектирования, которые я выбрал, были очищены, потому что PHP не имел поддержки определенной функции.
Я нахожу это расстраивающим, и у меня нет идей.
Требования
Базовый абстрактный класс или интерфейс для FileSystem
, который наследует любой другой тип файловой системы. Класс FileSystem
(и его подклассы) — это «драйвер», который реализует базовые операции FS, такие как «перемещение», «удаление», «создание» и т. д.
Эти операции драйвера не должны быть доступны пользователю класса, вместо этого FileSystem
также является фабрикой, которая извлекает записи информации о файле по запросу.
Файл также основан на абстрактном классе или интерфейсе File
и Directory
, которые разработчики подкласса FileSystem
могут или не могут подклассировать. Пользователи класса FileSystem
не «заботятся» о типе File
(SshFile
и SvnFile
должны работать одинаково).
Класс File
(и Directory
) должен каким-то образом взаимодействовать с драйвером файловой системы, создавшим его, при этом пользователь не сможет сделать это вручную через драйвер FileSystem
.
Что я пробовал
Естественно, я сделал FileSystem
абстрактным классом, затем приступил к кодированию класса File
и оказалось, что PHP не поддерживает friend
, поэтому File
не может иметь доступа к защищенным методам драйвера FileSystem
.
Другая идея, которая была отвергнута, заключалась в том, что класс внутри класса — FileSystem
и FileSystem::File
— PHP не имеет вложенных классов.
Разделите FileSystem
на FileSystemDriver
и FileSystemFactory
, но это приведет меня к той же исходной проблеме.
300 очков репутации в награду за голову
Решателю оригинальной идеи в отсутствие в PHP программных утилит, необходимых для инкапсуляции.