Closed sergey-s-betke closed 10 years ago
Итак, через иерархию интерфейсов можно обеспечить необходимую гибкость и контроль типов в коде на этапе выполнения. Но теперь - вопрос в реализации. Ведь в фабрику необходимо не только интерфейсы добавить, но и их реализацию! Хотелось бы избежать кучи if ( $this instanceof I...)
.
С использованием ReflectionClass
(примеры) можно построить следующую схему: в конструкторе базового класса фабрики через reflection получать перечень реализуемых интефейсов. Далее - можно реализовать некий механизм автозагрузки необходимых модулей Фреймворка по перечню интерфейсов - для загрузки реализации этих интерфейсов.
А с "динамической" реализацией интерфейсов могут быть некоторые сложности. Пока всё, что приходит на ум - создавать некий массив в объекте фабрики, где каждому интерфейсу будет соответствовать объект, реализующий его методы.
Обеспечить взаимосвязь с объектами при этом можно через __call
.
Неверная идея. В корне.
Дело в том, что компонентов плагина, реализующих один и тот же интерфейс, может быть несколько. Например - и собственная таблицы / таблицы в БД, и опции реализуют интерфейс IActivatable
.
Посему, при инициализации экземпляра фабрики необходимо ей передавать объекты компонентов плагина.
И для admin-side небходим отдельный файл (<plugin-file-name>-admin.php
), в котором будет определяться ещё одна фабрика, в качестве одного из аргументов которой - базовая фабрика будет.
И называть обсуждаемые объекты фабриками - неправильно. Они вовсе не фабрики. Они, по сути, и определяют функциональность плагина, они и есть плагин. А компоненты - компоненты плагина.
Возможно - и для frontend так же целесообразно выделить отдельный файл <plugin-file-name>-frontend.php
, которого может и не быть для некоторых плагинов.
Сейчас фабрика класса инстанциируется без переопределения в плагине. В результате в сам класс фабрики придётся тащить много избыточного кода, который потребуется далеко не всем плагинам.
Поэтому всё-таки целесообразно сделать фабрику переопределяемой с определением в этот момент необходимого функционала.
Учитывая тот факт, что множественное наследование в php невозможно, определять необходимый функционал можно через реализацию интерфейсов. С ними и типизация поддерживается, что удобно.