Weaving aspects in PHP with the help of Go! AOP library
1. Getting rid of duplicate code:
weaving aspects in PHP with the help of Go! AOP library
Alexander Lisachenko
lisachenko.it@gmail.com
2. Speaker profile
Lisachenko Alexander
• Senior Web Architect at Alpari
• Symfony2 enthusiast: nearly a dozen internal services based
on Symfony2, including primary site alpari.ru(CDN,
Varnish+ESI, Twig, Assetic, ~60 submodules, ~20 bundles)
3. The evolution of programming
• Machine programming;
• Structured programming;
• Procedure programming;
• Module programming;
• Object-oriented programming;
• < new high-level paradigm >
4. Good old OOP…
Key elements: classes, objects.
Principles: abstraction, encapsulation, inheritance and
polymorphism.
11. Why is this so?
All because of crosscutting concerns that permeates all
of the code, like a skewer.
This code can not be placed in separate classes, and is
everywhere:
• caching;
• logging;
• exception handling;
• authorization;
• transactionality.
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 the
class, tangled logic, cyclomatic complexity;
• more likely to make a mistake and forget to write
"boilerplate" code;
• copying of the code, the violation of DRY.
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. 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 the
European Conference on OOP)
• 2001 – AspectJ AOP framework development
16. Basic concepts of AOP
• Aspect - the module or class implementing
crosscutting concerns. Aspect changes the behavior of
the rest of the code, using advice in joinpoints identified
by some pointcut.
• Advice - action taken by an aspect at a particular join
point. Different types of advice include "around,"
"before" and "after" advice.
17. Basic concepts of AOP
• Join point — a point during the execution of a
program, such as the execution of a method or the
handling of an exception.
• Pointcut — set of join point. Pointcut determines if it
is suitable join point to the advice given.
• Introduction — changing the structure of the class
and / or change the inheritance hierarchy to add aspect
functionality in foreign code.
19. Basic advice types
• Before - advice that executes before a join point, but
which does not have the ability to prevent execution
flow proceeding to the join point.
• After - advice to be executed after a join point
completes normally.
• Around - advice that surrounds a join point such as a
method invocation. Around advice responsible for
choosing whether to proceed to the join point or to
shortcut the advised method execution by returning its
own return value or throwing an exception.
21. Place for AOP in PHP
AOP complements existing technology into a single
entity:
• Dependency injection (IoC, DIC)
• Abstraction of services (yaml, xml, php)
• Aspect-Oriented Programming
22. Place for AOP in PHP
• Dependency injection
• Abstraction of services
• Aspect-Oriented Programming
24. Go! library
The basic idea is not new - replace a class with a similar
class-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. Go! library
• Does not use PHP-extensions, written entirely in PHP
itself;
• Does not require the DI-container for spoofing
services with proxy objects;
• Can intercept methods in final classes, final methods,
and static methods;
• Can intercept access to public and protected
properties;
• Clean code is generated, it is convenient to debug
classes and aspects with XDebug
33. What is expected?
• Pointcut parser (look at FLOW3)
• Introduction — add traits and interfaces to classes
• Caching array of advices in shared-memory — no
need to check anything at runtime (hello, serialization of
Closure)
• Init joinpoints — replace all «new» expressions with
custom joinpoints
• Maximum performance :)
34. Thank you!
Questions?
https://github.com/lisachenko/go-aop-php
Our company profile
Link to the library:
on hh.ru