Aspect-Oriented Programming in PHP

1,375 views

Published on

Presentation about aspect-oriented programming in PHP with Go! framework on DevConf-2013 conference.

Published in: Technology
1 Comment
4 Likes
Statistics
Notes
No Downloads
Views
Total views
1,375
On SlideShare
0
From Embeds
0
Number of Embeds
131
Actions
Shares
0
Downloads
12
Comments
1
Likes
4
Embeds 0
No embeds

No notes for slide

Aspect-Oriented Programming in PHP

  1. 1. Аспектно-ориентированноепрограммирование в PHPЛисаченко Александр, архитектор web-приложений Alpari-RU
  2. 2. О докладчикеЛисаченко Александр• Архитектор веб-приложений в Alpari• Опыт работы во всех основных направленияхPHP-разработки (highload, бизнес-приложения, веб-сервисы, соц. сети)• Идеолог Symfony2: почти десяток внутреннихсервисов на Symfony2, в т.ч. и основной сайтalpari.ru (CDN, Varnish+ESI, Twig, Assetic, ~60сабмодулей, ~20 бандлов)Twitter: @lisachenkoGithub: https://github.com/lisachenko
  3. 3. Эволюция технологийМашинное программированиеСтруктурированное программированиеПроцедурное программированиеМодульное программированиеОбъектно-ориентированное программирование???
  4. 4. Логические единицы кода• Функции• ПроцедурыПроцедурное• МодулиМодульное• Классы• Методы• СвойстваООП
  5. 5. Принцип единственной отвественности
  6. 6. Принцип единственной отвественности
  7. 7. Сквозная функциональность
  8. 8. Сквозная функциональностьСквознаяфункцио-нальностьАвторизацияОбработка ошибокКэшированиеВедение логов
  9. 9. Управление авторизацией
  10. 10. Журналирование
  11. 11. Обработка ошибок
  12. 12. Матрешка функциональностиАвто-ризацияЛогиро-ваниеОбра-боткаошибокОснов-ной код
  13. 13. Почему это плохо?Плюсы:• Видна вся логика методаМинусы:• Код нельзя использоватьповторно• трудно понять исходноепредназначение класса• запутанная логика• больше вероятностьдопустить ошибку, забыввписать «шаблонный»код• нарушение принципа DRY
  14. 14. Аспектное программированиеПроцедурноепрограммированиеООПАОП
  15. 15. Аспектно-ориентированное программированиеАОП - методика программирования врамках классовой парадигмы,основанная на понятии аспекта —блока кода, инкапсулирующегосквозное поведение в составеклассов.
  16. 16. Аспектно-ориентированное программированиеМетодология АОП была предложена группойинженеров исследовательского центра XeroxPARC под руководством Грегора Кичалеса(Gregor Kiczales).Ими же было разработано аспектно-ориентированное расширение для языка Java,получившее название AspectJ — (2001 год).
  17. 17. Аспектно-ориентированное программированиеАОП дает возможностьвызвать дополнительный код(хук) в определенныймомент работы программы:до выполнения метода,после выполнения метода,при обращении к свойству идругим без измененияисходного кода программы!
  18. 18. Ключевые понятия и терминыАspect-OrientedProgram-mingJoinpointPointcutAdviceAspectIntroduction
  19. 19. Ключевые понятия и терминыAspect• Модуль или класс,реализующий сквознуюфункциональность.• Аспект изменяет поведениеостального кода, применяясовет в точках соединения,определённых некоторымсрезомAdvice(совет)• Дополнительная логика,которая должна бытьвызвана из точки соединения
  20. 20. Ключевые понятия и терминыJoinpoint• Точка в выполняемойпрограмме, где следуетприменить совет• Выполнение метода,обращение к свойствамобъекта и др.Pointcut(срез)• Набор точек соединения.• Срез определяет, подходитли данная точка соединенияк данному совету
  21. 21. Пример: паттерн FluentInterfaceMethod execution joinpointProperty access joinpoint
  22. 22. Пример: паттерн FluentInterfaceAdvicePointcutdefinitionAspect class
  23. 23. Процесс вплетения кодаПерехватinclude/requireStream wrapper(php://filter)Статическийанализ кода(token_get_all)TokenReflectionАнализPointcut-овМодификацияисходного кода
  24. 24. Пример: паттерн Fluent InterfaceAround adviceOriginal methodOriginalmethodAOP
  25. 25. Фреймворк Go! AOP PHP• Не использует PHP-расширений, целиком написан на самомPHP;• Может быть использован с любым приложением на PHP;• Оптимизирован (ленивая загрузка ядра, кэшированиеклассов, поддержка опкод-кэшеров)• Не требует DI-контейнера для подмены сервисов прокси-объектами;• Может перехватывать динамические и статические методы,методы в финальных классах, а также методы в трейтах;• Может перехватывать обращения к публичным изащищенным полям;• Чистый генерируемый код, удобно проводить отладкуклассов и аспектов с помощью XDebug
  26. 26. Срезы точек в Go! AOP PHP1. Выполнение методов1. Динамических: execution(public Example->method(*))2. Статических: execution(public **::*someStatic*Method*(*))3. Защищенных: execution(protected Ns**Example->protected*(*))4. С аннотацией: @annotation(FirstSecondAnnotationClass)2. Все методы в определенном классе1. Конкретный класс: : within(GoAspectsTest)2. В указанном неймспейсе: within(GoAspects*)3. Включая суб-неймспейсы: within(GoAspects**)4. Потомки конкретного класса: within(DemoInterface+)3. Обращение к свойствам1. Публичные: access(* ExampleAspect*->property*)2. Защищенные: access(protected TestClass*->protected*Property)4. Логические1. ИЛИ : within(A) || within(B)2. И: within(A) && within(B)3. НЕ: !within(A)
  27. 27. Типажи (trait) в PHP – хорошо или плохо?Хорошо Плохо
  28. 28. Пример: trait + interface + AOP = IntroductionIntroduction• возможность динамическиподключать интерфейсы и типажи кконкретному классу.
  29. 29. Пример: trait + interface + AOP = IntroductionИсходный класс•Обратите внимание, что мы неимплементриуем интерфейсов и неподключаем типажи в исходном классе.
  30. 30. Пример: trait + interface + AOP = IntroductionКласс после вплетения кода•К классу был добавлен динамическизаданный интерфейс и типаж
  31. 31. Пример: логирование на уровне приложения
  32. 32. Пример: логирование на уровне приложения
  33. 33. За и против глобальных срезовЗа•Позволяет сделать срез влюбом коде, даже стороннем•Легко описать нужныйнеймспейс•Быстрота внедрения•Не нужно менять исходныйкод вообщеПротив•Action at a distance –непредсказуемые эффекты вкоде методов•Цепляет и нужное иненужное•Может немного замедлитьприложение из-за большогоколичества точек•Высока вероятностьдопустить ошибку
  34. 34. Пример: логирование на уровне приложения
  35. 35. Контроллируемые срезыЗа•Используются стандартнаятехнология интерфейсов-маркеров и срезwithin(InterfaceName+)•Используются наглядныеаннотации-маркеры передметодами и срез@annotation(ClassName)•Влияют только на указанныйразработчиком код(ожидаемое поведение)Против•Необходимо вноситьнебольшие правки в исходныйкод•Ограниченная возможностьработать с сторонним кодом
  36. 36. Проблема с доступом к состоянию объекта1. Как вы уже наверное поняли, основноедостоинство настоящего АОП – это возможностьдополнять логику методов или целого классадополнительным функционалом без измененияисходного кода.2. Но класс аспекта является внешним поотношению к классу перехватываемогообъекта, а значит, мы можем пользоватьсятолько публичными данными объекта, а чтоделать если нужно обратиться к приватным илизащищенным полям или методам объекта?
  37. 37. Привилегированные советыПривилеги-рованныйсовет• Совет (метод) в классе аспекта,который выполняется в областивидимости текущего объекта иимеет доступ к приватным изащищенным полям и методамкласса
  38. 38. Попробуем считать поле $name в совете
  39. 39. Обычный совет работает согласно scope
  40. 40. Привилегированный совет
  41. 41. Привилегированный совет в scope объекта
  42. 42. АОП – следующий шаг в развитии PHPООПАбстракциясервисов(yaml, xml,php)Внедрениезависи-мостей(IoC, DIC)Аспектно-ориентиро-ванноепрограмми-рование
  43. 43. AOP: за и противЗа•Управление сквознойфункциональностью•Снижение стоимостиразработки•Более прозрачный код логики•Уменьшение шаблонных ошибок•Уменьшение связанностиклассов•Повторное использование кодаПротив•Порог вхождения•Неявные эффекты•Ограниченная помощь IDE•Незначительное снижениескорости выполнения кода
  44. 44. Благодарю за внимание!Go! AOP PHP: https://github.com/lisachenko/go-aop-phpOfficial site: http://go.aopphp.comZendFramework2 demo: http://zf2.aopphp.com/?aspect

×