@niksamokhvalov
Веб-разработчик

Как внедриться в класс?

Разрабатываю для одного не очень гибкого фреймворка функционал т. н. «плагинов». Описывать функционал целиком не буду, сразу конкретизирую проблему.

Примитивная схема. Есть класс Component (ядро фреймворка). Есть трейт PluginTrat (мой трейт, могу писать всё что угодно), который подключается в компоненте:

class Component
{
     use PluginTrait;

     function executeComponent()
     {
          …
     }
}

trait PluginTrait
{
     …
}


Мне нужно в трейте, не переназначая метод executeComponent(), внедриться в класс компонента и вызвать до и после выполнения метода executeComponent() свои методы трейта. Т. е. шаги выполнения класса компонента должны быть такими:

1. методТрейта1.
2. метод компонента executeComponent() (ну он и так сам будет выполняться).
3. методТрейта2.

Проблема заключается в том, что класс Component — это ядро фреймворка, и по определённым соображениям менять (внедряться) я его не могу. Кроме того, нужно учитывать, что цепочка наследования класса может быть увеличена, и в дочерних классах появится свой метод executeComponent() (его присутствие не должно нарушать порядок выполнения класса, описанный выше).
  • Вопрос задан
  • 356 просмотров
Пригласить эксперта
Ответы на вопрос 3
difiso
@difiso
В параллельной вселенной я космонавт
Пример #2, не?

<?php
class Base {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait SayWorld {
    public function sayHello() {
        parent::sayHello();
        echo 'World!';
    }
}

class MyHelloWorld extends Base {
    use SayWorld;
}

$o = new MyHelloWorld();
$o->sayHello(); // Hello World!
?>
Ответ написан
@Leshgan
class myComponent extends Component
{
function executeComponent()
     {
       ...  
       parent::executeComponent();
       ...
     }

}

Так?
Ответ написан
@v1os
habrahabr.ru/post/106426 так можно, если поизвращаться чуток. Observer паттерн хорошо описан в книгах
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы