Weaving aspects in PHP with the help of Go! AOP library

54,438 views

Published on

Published in: Technology
0 Comments
11 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
54,438
On SlideShare
0
From Embeds
0
Number of Embeds
47,283
Actions
Shares
0
Downloads
32
Comments
0
Likes
11
Embeds 0
No embeds

No notes for slide

Weaving aspects in PHP with the help of Go! AOP library

  1. 1. Getting rid of duplicate code:weaving aspects in PHP with the help of Go! AOP library Alexander Lisachenko lisachenko.it@gmail.com
  2. 2. Speaker profile Lisachenko Alexander• Senior Web Architect at Alpari• Symfony2 enthusiast: nearly a dozen internal services basedon Symfony2, including primary site alpari.ru(CDN,Varnish+ESI, Twig, Assetic, ~60 submodules, ~20 bundles)
  3. 3. The evolution of programming• Machine programming;• Structured programming;• Procedure programming;• Module programming;• Object-oriented programming;• < new high-level paradigm >
  4. 4. Good old OOP…Key elements: classes, objects.Principles: abstraction, encapsulation, inheritance andpolymorphism.
  5. 5. The principle of single responsibility
  6. 6. The principle of single responsibility
  7. 7. The principle of single responsibility
  8. 8. Authorization...
  9. 9. Logging...
  10. 10. Exception handling...
  11. 11. Why is this so?All because of crosscutting concerns that permeates allof the code, like a skewer.This code can not be placed in separate classes, and iseverywhere:• caching;• logging;• exception handling;• authorization;• transactionality.
  12. 12. What do we have in the end?The clinical diagnosis of typical application: <censored>-code• unsuitable for reuse;• difficult to understand the original purpose of theclass, tangled logic, cyclomatic complexity;• more likely to make a mistake and forget to write"boilerplate" code;• copying of the code, the violation of DRY.
  13. 13. AOP to the rescue!
  14. 14. AOP to the rescue! Aspect-Oriented Programming (AOP)• AOP - programming technique in the class paradigm, based on the concept of aspect - a block of code that encapsulates the crosscutting logic in the class.
  15. 15. AOP History•1974 – the principle of division of responsibility•1990е – AOP research • Composition Filters • Subject-Oriented Programming • Adaptive Programming• 1997 - Aspect-Oriented Programming (report on theEuropean Conference on OOP)• 2001 – AspectJ AOP framework development
  16. 16. Basic concepts of AOP• Aspect - the module or class implementingcrosscutting concerns. Aspect changes the behavior ofthe rest of the code, using advice in joinpoints identifiedby some pointcut.• Advice - action taken by an aspect at a particular joinpoint. Different types of advice include "around,""before" and "after" advice.
  17. 17. Basic concepts of AOP• Join point — a point during the execution of aprogram, such as the execution of a method or thehandling of an exception.• Pointcut — set of join point. Pointcut determines if itis suitable join point to the advice given.• Introduction — changing the structure of the classand / or change the inheritance hierarchy to add aspectfunctionality in foreign code.
  18. 18. Basic concepts of AOP
  19. 19. Basic advice types• Before - advice that executes before a join point, butwhich does not have the ability to prevent executionflow proceeding to the join point.• After - advice to be executed after a join pointcompletes normally.• Around - advice that surrounds a join point such as amethod invocation. Around advice responsible forchoosing whether to proceed to the join point or toshortcut the advised method execution by returning itsown return value or throwing an exception.
  20. 20. Basic advice types Before Before After Throwing After
  21. 21. Place for AOP in PHP AOP complements existing technology into a singleentity:• Dependency injection (IoC, DIC)• Abstraction of services (yaml, xml, php)• Aspect-Oriented Programming
  22. 22. Place for AOP in PHP• Dependency injection• Abstraction of services• Aspect-Oriented Programming
  23. 23. Current implementation of AOP Promising solutions:• AOP-PHP• JMSAopBundle• TYPO3 Flow AOP component Cemetery:• PHPAspect• Aspect-Oriented PHP• AspectPHP
  24. 24. Go! library The basic idea is not new - replace a class with a similarclass-decorator implementation. Key points: • Static analysis of classes before loading them into memory (php-token-reflection, ядро ApiGen) • Change the class hierarchy "on the fly" • Modification of source code for the class at the time of class load, caching
  25. 25. Go! library• Does not use PHP-extensions, written entirely in PHPitself;• Does not require the DI-container for spoofingservices with proxy objects;• Can intercept methods in final classes, final methods,and static methods;• Can intercept access to public and protectedproperties;• Clean code is generated, it is convenient to debugclasses and aspects with XDebug
  26. 26. Class source code
  27. 27. Aspect class
  28. 28. The result of running...
  29. 29. Processed code of the class
  30. 30. A good example is the bestsermon
  31. 31. A good example is the bestsermon
  32. 32. Caching with aspect example
  33. 33. What is expected?• Pointcut parser (look at FLOW3)• Introduction — add traits and interfaces to classes• Caching array of advices in shared-memory — noneed to check anything at runtime (hello, serialization ofClosure)• Init joinpoints — replace all «new» expressions withcustom joinpoints• Maximum performance :)
  34. 34. Thank you! Questions? https://github.com/lisachenko/go-aop-phpOur company profile Link to the library:on hh.ru

×