Презентация к докладу на SymfonyCampUA-2012.
В докладе рассмотрены основные вопросы работы с АОП в PHP, даны определения аспектов, срезов, советов, а также рассмотрено реальное использование библиотеки GO! для внедрения аспектно-ориентированной парадигмы в любое приложение.
Внедрение аспектов в PHP с помощью библиотеки GO! AOP
1. Избавляемся от дублирования кода:
внедрение аспектов в PHP с помощью библиотеки
Go! AOP
Alexander Lisachenko
lisachenko.it@gmail.com
2. О докладчике
Лисаченко Александр
• Архитектор веб-приложений в Alpari
• Идеолог Symfony2: почти десяток внутренних
сервисов на Symfony2, в т.ч. и основной сайт alpari.ru
(CDN,Varnish+ESI, Twig, Assetic, ~60 сабмодулей, ~20
бандлов)
11. Почему же это так ?
Всему виной сквозная функциональность,
пронизывающая весь код, подобно шампуру.
Этот код не может быть вынесен в отдельные
классы и лежит везде:
• кэширование;
• журналирование;
• обработка исключений;
• проверка доступа;
• транзакционность.
12. Что у нас в итоге ?
Клинический диагноз типичного приложения:
<censored>-код:
• непригодный к повторному использованию;
• трудно понять исходное предназначение
класса, запутанная логика, большая
цикломатическая сложность;
• больше вероятность допустить ошибку, забыв
вписать «шаблонный» код;
• копирование кода обработки, нарушение
принципа DRY.
14. АОП нам в помощь !
Аспектно-ориентированное программирование
(АОП)
• АОП - методика программирования в рамках
классовой парадигмы, основанная на понятии
аспекта — блока кода, инкапсулирующего
сквозное поведение в составе классов.
15. История возникновения АОП
•1974 – принцип разделения ответственности
•1990е – исследования АОП
• Composition Filters
• Субъектно-ориентированное
программирование
• Адаптивное программирование
• 1997 - Аспектно-ориентированное
программирование (доклад на европейской
конференции по ООП)
• 2001 – разработка АОП фреймворка AspectJ
16. Основные понятия АОП
• Аспект (англ. aspect) — модуль или класс,
реализующий сквозную функциональность.
Аспект изменяет поведение остального кода,
применяя совет в точках соединения,
определённых некоторым срезом.
• Совет (англ. advice) — средство оформления
кода, который должен быть вызван из точки
соединения. Совет может быть выполнен до,
после или вместо точки соединения.
17. Основные понятия АОП
• Точка соединения (англ. join point) — точка в
выполняемой программе, где следует
применить совет.
• Срез (англ. pointcut) — набор точек
соединения. Срез определяет, подходит ли
данная точка соединения к данному совету.
• Внедрение (англ. introduction, введение) —
изменение структуры класса и/или изменение
иерархии наследования для добавления
функциональности аспекта в инородный код.
19. Базовые типы советов (Advice)
• Before - совет выполняется до вызываемого
метода или свойства.
• After - совет выполняется после вызываемого
метода.
• Around - совет выполняется вместо
вызываемого метода. Внутри обработчика есть
возможность ручной передачи управления в
вызываемый метод, если это необходимо.
21. Место для АОП в PHP
АОП органично дополняет существующие
технологии в единое целое:
• Внедрение зависимостей (IoC, DIC)
• Абстракция сервисов (yaml, xml, php)
• Аспектно-ориентированное программирование
22. Место для АОП в PHP
• Внедрение зависимостей
• Абстракция сервисов
• Аспектно-ориентированное программирование
23. Текущие реализации АОП в PHP
Перспективные решения:
• AOP-PHP
• JMSAopBundle
• TYPO3 Flow AOP component
Кладбище реализаций:
• PHPAspect
• Aspect-Oriented PHP
• AspectPHP
24. Библиотека Go!
Базовая идея не нова — заменяем класс
аналогичной реализацией-декоратором.
Ключевые моменты:
• Статический анализ классов перед их
загрузкой в память (php-token-reflection, ядро
ApiGen)
• Изменяем иерархию классов «на лету»
• Модификация исходного кода класса в
момент загрузки класса, кэшируем готовые
классы
25. Библиотека Go!
• Не использует PHP-расширений, целиком
написана на самом PHP;
• Не требует DI-контейнера для подмены
сервисов прокси-объектами;
• Может перехватывать методы в финальных
классах, финальные методы, а также
статические методы;
• Может перехватывать обращения к
публичным и защищенным полям;
• Чистый генерируемый код, удобно проводить
отладку классов и аспектов с помощью XDebug
33. Что ожидается еще ?
• Парсер pointcut-ов (смотрим на FLOW3)
• Introduction — навешиваем трейты и
интерфейсы на классы
• Кэширование массива советов в shared-памяти
— не нужно проверять в рантайме вообще
ничего (привет, сериализация Closure)
• Поддержка точек init — отлаливаем все
конструкции new и выполняем свой код
• Максимальная производительность :)