Динамическая "прогрузка" классов

craz

Нестандартное звание
В классе есть такая функция
PHP:
.....
public function getClass(){

$class = "\\Sites\\{$this->params['site']}";      
        return new $class;
}
.....
1) динамическая загрузка классов - архитектурная ошибка?
2) если всегда да, то как исправляется?
3) если иногда нет, то как заставить IDE понимать, что это за класс, если все динамически загружаемые классы наследуются от одного класса с описанным интерфейсом(не знаю, но мне кажется это важно для решения моей проблемы?).

Спасибо за ответы.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
1) динамическая загрузка классов - архитектурная ошибка?
2) если всегда да, то как исправляется?
3) если иногда нет, то как заставить IDE понимать, что это за класс, если все динамически загружаемые классы наследуются от одного класса с описанным интерфейсом(не знаю, но мне кажется это важно для решения моей проблемы?).
Спасибо за ответы.
1+ 2 Ты можешь возвращать разные объекты, но они должны реализовывать один общий интерфейс, иначе вся твоя логика дальнейшего использования будет в костылях с проверками.
 

craz

Нестандартное звание
class ClassName extends Util{}
class Util implements Interface{}
Вот я хочу чтобы IDE мне подсказывала для ClassName методы из Util или хотя бы из Interface.
По сути архитектурно, наверное, правильно будет, чтобы в ClassName все методы или реализовывали методы интерфейса или расширяли методы Util. Я же не обязан все методы Util в интерфейсе держать - я прав?
 

craz

Нестандартное звание
1. фабрика
2. что "всегда да" ?

PHP:
/**
* @return \Sites\Interface " с описанным интерфейсом"
*/
2. динамическая загрузка это всегда архитектурная ошибка?

Решило проблему @return я правда до предка "прокинулся", то есть у меня стали доступны все методы интерфейса и методы предка.
Спасибо большое.
 

Вурдалак

Продвинутый новичок
2. динамическая загрузка это всегда архитектурная ошибка?
Ошибка в том, что наивно предполагается, что достаточно будет лишь new $class. А если какая-то из реализацией потребует каких-то зависимостей через конструктор?
 

craz

Нестандартное звание
Типа new $class($params)? Я переписался на фабрику спасибо вам за совет.
 

WMix

герр M:)ller
Партнер клуба
В чем? Почему я не должен видеть методы предка или интерфейса? Можно подробнее.
ты завязан на предке. ты не знаешь в каком месте какой метод используется, он будет разрастаться и все превратится в один общий котейнер.
требует знания $params в локальной области где эта строка написана
 
  • Like
Реакции: craz

craz

Нестандартное звание
требует знания $params в локальной области где эта строка написана
Да поэтому я и переписал на фабрику.
ты завязан на предке. ты не знаешь в каком месте какой метод используется, он будет разрастаться и все превратится в один общий котейнер.
Ну пускай растет: у меня большая связанность классов, которые я буду пропускать через фабрику. То есть по сути 90% делает один класс предок и только 10% конкретная реализация.
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
А вот это уже архитектурная ошибка. Классы надо по возможности развязывать.
 

craz

Нестандартное звание
Не могу я классы развязать... это классы которые делают одну фигню, которую тут нельзя обсуждать))))))) и отличаются они только работой с DOM (он разный для каждого класса).

При этом класс выпускаемый фабрикой должен быть самодостаточным.
 

Вурдалак

Продвинутый новичок
То есть по сути 90% делает один класс предок и только 10% конкретная реализация.
Звучит так, словно код твоего предка можно вынести в отдельный класс и передавать этот объект в конструктор этих «конкретных реализаций». Composition over inheritance.
 

craz

Нестандартное звание
мне кажется нельзя, потому что мне нужна фабрика все равно.

php index.php -cmd entity params1 params2

entity это конкретный класс
 

Вурдалак

Продвинутый новичок
Не понимаю как связана фабрика и необходимость избавления от ненужного наследования.
 

fixxxer

К.О.
Партнер клуба
Это как раз тот случай, когда уместно работать с контейнером напрямую - в фабрику заинжектить сам контейнер, и делать что-то вроде return $container->make($class).
 

Adelf

Administrator
Команда форума
Парсер на IoC-контейнерах :) Что-то новое.
 
Сверху