Как внедриться в класс? Разрабатываю для одного не очень гибкого фреймворка функционал т. н. «плагинов». Описывать функционал целиком не буду, сразу конкретизирую проблему.
Примитивная схема. Есть класс Component (ядро фреймворка). Есть трейт PluginTrat (мой трейт, могу писать всё что угодно), который подключается в компоненте:class Component
{
use PluginTrait;
function executeComponent()
{

}
}
trait PluginTrait
{

}
Мне нужно в трейте, не переназначая метод executeComponent(), внедриться в класс компонента и вызвать до и после выполнения метода executeComponent() свои методы трейта. Т. е. шаги выполнения класса компонента должны быть такими:
1. методТрейта1.
2. метод компонента executeComponent() (ну он и так сам будет выполняться).
3. методТрейта2.
Проблема заключается в том, что класс Component — это ядро фреймворка, и по определённым соображениям менять (внедряться) я его не могу. Кроме того, нужно учитывать, что цепочка наследования класса может быть увеличена, и в дочерних классах появится свой метод executeComponent() (его присутствие не должно нарушать порядок выполнения класса, описанный выше).

21 Авг 2019 в 07:07
173 +1
1
Ответы
1

Для решения данной проблемы можно воспользоваться так называемым паттерном decorator (декоратор). В данном случае, вы можете создать декоратор для класса Component, который будет расширять его функционал без изменения самого класса Component.

Примерный код приблизительно может выглядеть так:

class ComponentDecorator
{
protected $component;
public function __construct(Component $component)
{
$this->component = $component;
}
public function executeComponent()
{
$this->beforeExecution();
$this->component->executeComponent();
$this->afterExecution();
}
protected function beforeExecution()
{
// ваш код перед выполнением executeComponent()
}
protected function afterExecution()
{
// ваш код после выполнения executeComponent()
}
}
// Использование
$decoratedComponent = new ComponentDecorator(new Component());
$decoratedComponent->executeComponent();

При таком подходе, вы можете изменять функционал класса Component через декоратор, не нарушая его структуру. Также, если у вас есть дочерние классы Component, вы также можете создать декоратор для них, расширяя их функционал.

Надеюсь, это поможет вам решить проблему с внедрением функционала в класс в вашем не очень гибком фреймворке.

20 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 648 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир