PHP Decorator Writer Script - PullRequest
       7

PHP Decorator Writer Script

4 голосов
/ 04 октября 2010

В эти дни я начинаю чаще использовать декораторы в PHP для изменения поведения объекта во время выполнения. Моя проблема в первую очередь связана с ленью, у нас есть много унаследованных классов с множеством методов, и мысль о необходимости переписать / переопределить их все для каждого класса декоратора вызывает у меня грусть. Кто-нибудь знает о существующей утилите командной строки, которая написала бы эти декораторы для меня?

Или, может быть, есть лучший способ сделать это?

Ответы [ 2 ]

3 голосов
/ 04 октября 2010

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

public function __call($method, $args) {
    return call_user_func_array(
        array($this->decoratedInstance, $method),
        $args
    );
}

Вы также можете добавить __callStatic, __get и __set по мере необходимости.Но учтите, что магические перехватчики всегда влекут за собой снижение производительности.Если у вас много вложенных декораторов, это может быть заметно.В случае сомнений, тест.

0 голосов
/ 09 марта 2011

GOF рекомендует, чтобы все классы в этом шаблоне были производными от одного абстрактного класса компонентов. Вы можете получить класс из существующего класса, чтобы добавить эту функциональность в класс DynamicComponent для того же эффекта. Вы извлекаете внутренние объекты из этого класса. В этом классе можно использовать магические методы для динамической обработки свойств и маршрутизации сообщений. Вам понадобятся __get (), _ set (), _call () и, возможно ,__construct (). Я использую фабричный метод с защищенными конструкторами для имитации множественного наследования. Фабрика возвращает автономный компонент или упакованный компонент (обычно по указанию построителя коллекции, например, построителя дерева, который получает свои данные из базы данных, например).

Функциональность обёртывания происходит в абстрактном классе, также производном от общего класса компонентов.

Вы предоставляете реализации каждого метода в общем интерфейсе. Эти переопределяющие функции синхронизируют данные во внутреннем элементе и внешнем элементе и обеспечивают проводку для передачи необработанных сообщений во внутренний элемент. По сути, каждый класс, участвующий в этом шаблоне, автоматически получает базовые функции __get () и __set () от родительского, а расширенные - от inner_item. Они связаны в абстрактном классе для отправки сообщений своим аналогам inner_item. Конкретная оболочка получает интерфейс компонента бесплатно от своего родителя и может сосредоточиться на добавленной функциональности. Если вы хотите избавиться от общего родителя, то общий интерфейс необходимо будет повторно реализовать в каждом конкретном классе-обертке. Еще одним преимуществом является возможность добавлять функции, такие как сравнение и __toString () в базовый класс. Объекты могут использоваться полностью взаимозаменяемо в таких функциях, как usort () и других структурах list / tree / stack / cue / array / любых других, потому что они не просто выглядят как один и тот же интерфейс, они одного типа!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...