Соблюдение PSR-1. Побочные эффекты и знаки. Как соблюсти при Композиции?


Разбираюсь со стандартом PSR-1.

Пункт 3 гласит:
*Файлам СЛЕДУЕТ либо объявлять знаки (классы, функции, константы, и т.д.) или оказывать побочный эффект (например, генерировать вывод, изменять .ini настройки, и т.д.) но НЕ СЛЕДУЕТ делать и то и другое.*

По логике получается если я объявил класс `SuperClass` в файле `superclass.php`, в этом же файле я не могу выполнить `require_once` другого файла.

Как быть в той ситуации, когда у меня есть набор файлов с классами-helper'ами(например - хэширование, генерирование имени пользователя, генерирование графиков...), которые используются в классе `SuperClass`?


**Как я бы сделал**:

**Первый вариант**: могу подключить helper'ы в родительском файле, который использует `SuperClass`. Но тогда это будет нарушением принципа Open-Close. Так как клиент должен будет знать о реализации класса, который он использует.

**Второй вариант** - я могу использовать Dependency Injection и передавать в SuperClass нужные ему helper'ы. Но их ОЧЕНЬ много. Будет конструктор-монстр или очень долгий шаблон Builder, что тоже не всегда хорошо.


Подскажите, пожалуйста, какой вариант лучше и есть ли еще варианты?

Не использовать PSR-1 НЕ могу - требование менеджера.

Ответы (1 шт):

Автор решения: Мелкий

PSR-1 предполагает использование механизма autoloading, в частности соответствующего PSR-4 (либо устаревшего PSR-0).

И всё, никакого противоречия в требованиях, никаких странных архитектурных граблей, как и вовсе нет множества раскиданных всюду include. В файле с объявлением класса остаётся только объявление этого класса. Все другие классы, используемые в этом файле, будут подгружены из своих файлов автоматически по вполне понятным путям из названия и пространства имён требуемого класса.


Впрочем, я бы не сказал, что include_once или require_once объявления чего-либо другого нарушает требование PSR-1, что файл должен или объявлять что-то или выполнять side-effects.

→ Ссылка