SlideShare a Scribd company logo
Solving Cross-Cutting
Concerns in PHP
Alexander Lisachenko
About me:
2
lisachenko
lisachenko
‣ Head of Software Architecture at
Alpari (RU) Forex Broker
About me:
2
lisachenko
lisachenko
‣ Head of Software Architecture at
Alpari (RU) Forex Broker
‣ Have worked with computers since
7 years old
About me:
2
lisachenko
lisachenko
‣ Head of Software Architecture at
Alpari (RU) Forex Broker
‣ Have worked with computers since
7 years old
‣ Clean code advocate, guru in
enterprise architecture
About me:
2
lisachenko
lisachenko
‣ Head of Software Architecture at
Alpari (RU) Forex Broker
‣ Have worked with computers since
7 years old
‣ Clean code advocate, guru in
enterprise architecture
‣ Author of the aspect-oriented
framework Go! AOP 

http://go.aopphp.com
About me:
2
lisachenko
lisachenko
3
Agenda:
‣ Advantages of Object-Oriented Paradigm
3
Agenda:
‣ Advantages of Object-Oriented Paradigm
‣ Limitations of OOP and how they affect our
application
3
Agenda:
‣ Advantages of Object-Oriented Paradigm
‣ Limitations of OOP and how they affect our
application
‣ Existing object-oriented ways of solving cross-
cutting concerns
3
Agenda:
‣ Advantages of Object-Oriented Paradigm
‣ Limitations of OOP and how they affect our
application
‣ Existing object-oriented ways of solving cross-
cutting concerns
‣ Pros and cons: the aspect-oriented approach of
solving cross-cutting concerns
3
Agenda:
‣ Advantages of Object-Oriented Paradigm
‣ Limitations of OOP and how they affect our
application
‣ Existing object-oriented ways of solving cross-
cutting concerns
‣ Pros and cons: the aspect-oriented approach of
solving cross-cutting concerns
‣ Examples of using aspects in real life applications
3
Agenda:
Текст
Object-Oriented Paradigm
Solution to the complexity
5
Modularity
We connect classes, components, bundles, and frameworks.
6
Reusability
We use existing code to create new code on the top.
7
Encapsulation
We hide implementation details from the outside world.
8
Is it a silver bullet?
Object-Oriented Paradigm
8
Is it a silver bullet?
Object-Oriented Paradigm
8
Is it a silver bullet?
Object-Oriented Paradigm
Joe Armstrong
“…You wanted a banana but what you got [with OOP] was
a gorilla holding the banana and the entire jungle”
9
10
What are the problems?
‣ Limitation of object-oriented representation of real life
processes
10
What are the problems?
‣ Limitation of object-oriented representation of real life
processes
‣ Complexity results in strong coupling between
components
10
What are the problems?
‣ Limitation of object-oriented representation of real life
processes
‣ Complexity results in strong coupling between
components
‣ Essential complexity results in scattered implementation
of our concerns
10
What are the problems?
Текст
Cross-cutting concerns
What they are and why we should think about them
12
Cross-cutting concerns are aspects of a
program that affect other concerns.
13
Task:
13
Implement an audit system that checks access
permission for each public method over all
classes in our system and then logs this
information into the security journal.
Task:
Clean model
14
Authorization control…
15
Authorization control…
15
Authorization control…
15
Logging and audit…
16
Logging and audit…
16
Logging and audit…
16
Error handling…
17
Error handling…
17
Error handling…
17
Why this kind of code is bad?
18
Why this kind of code is bad?
18
Code tangling
19
Code tangling
19
Code tangling
20
Code tangling
20
- Strong coupling between classes
Code tangling
20
- Strong coupling between classes
- A low degree of code reusability
Code tangling
20
- Strong coupling between classes
- A low degree of code reusability
- Difficult evolution of codebase
Code scattering
21
Code scattering
21
Code scattering
21
Code scattering
22
Code scattering
22
- Lower productivity (repeated implementation
of multiple concerns in one class)
Code scattering
22
- Lower productivity (repeated implementation
of multiple concerns in one class)
- Breaks the focus of developers
Code scattering
22
- Lower productivity (repeated implementation
of multiple concerns in one class)
- Breaks the focus of developers
- More error prone (easy to forget to add
somewhere)
Текст
OOP ways
What do we have in OOP to fight cross-cutting concerns?
Decorator
Design pattern that allows
behavior to be added to an
individual object, either statically
or dynamically, without affecting
the behavior of other objects
from the same class.
24
25
25
25
25
Decorator
26
Decorator
+ Respects LSP - We can pass an instance of a decorator
everywhere the original object is expected.
26
Decorator
+ Respects LSP - We can pass an instance of a decorator
everywhere the original object is expected.
+ Keeps SRP for the original class because it doesn’t contain
secondary concerns now
26
Decorator
+ Respects LSP - We can pass an instance of a decorator
everywhere the original object is expected.
+ Keeps SRP for the original class because it doesn’t contain
secondary concerns now
- Too many decorator classes for each combination of
concern+concrete interface
26
Decorator
+ Respects LSP - We can pass an instance of a decorator
everywhere the original object is expected.
+ Keeps SRP for the original class because it doesn’t contain
secondary concerns now
- Too many decorator classes for each combination of
concern+concrete interface
- Secondary concerns (authorization, caching, etc.) are
scattered across all decorators
26
Decorator
+ Respects LSP - We can pass an instance of a decorator
everywhere the original object is expected.
+ Keeps SRP for the original class because it doesn’t contain
secondary concerns now
- Too many decorator classes for each combination of
concern+concrete interface
- Secondary concerns (authorization, caching, etc.) are
scattered across all decorators
- Additional overhead for calling original methods
26
Defines an object that
incapsulates all logic of
interactions between objects,
giving them the ability to work
without explicit references to
each other
27
Mediator
28
28
28
29
29
29
29
29
Mediator
30
+ All secondary concerns can be moved to separate classes
without duplication (SRP for secondary concerns)
Mediator
30
+ All secondary concerns can be moved to separate classes
without duplication (SRP for secondary concerns)
+ Keeps SRP for the original class, because it doesn’t
contain secondary concerns now
Mediator
30
+ All secondary concerns can be moved to separate classes
without duplication (SRP for secondary concerns)
+ Keeps SRP for the original class, because it doesn’t
contain secondary concerns now
+ The most flexible way of extending a system
Mediator
30
- Requires specific changes in the original class to perform
notification of mediator
+ All secondary concerns can be moved to separate classes
without duplication (SRP for secondary concerns)
+ Keeps SRP for the original class, because it doesn’t
contain secondary concerns now
+ The most flexible way of extending a system
Mediator
30
- Requires specific changes in the original class to perform
notification of mediator
- Hard to debug code with complex logic of interaction
because there are no explicit links between objects
+ All secondary concerns can be moved to separate classes
without duplication (SRP for secondary concerns)
+ Keeps SRP for the original class, because it doesn’t
contain secondary concerns now
+ The most flexible way of extending a system
Mediator
30
A programming paradigm
that aims to increase
modularity by allowing the
separation of cross-cutting
concerns
Aspect-Oriented Paradigm
31
Go! AOP Framework
32
goaop/framework
‣ Inspired by famous AspectJ and Spring Java frameworks
Go! AOP Framework
32
goaop/framework
‣ Inspired by famous AspectJ and Spring Java frameworks
‣ Almost 1K stargazers on Github - thank you!
Go! AOP Framework
32
goaop/framework
‣ Inspired by famous AspectJ and Spring Java frameworks
‣ Almost 1K stargazers on Github - thank you!
‣ Over 400k installations on Packagist
Go! AOP Framework
32
goaop/framework
‣ Inspired by famous AspectJ and Spring Java frameworks
‣ Almost 1K stargazers on Github - thank you!
‣ Over 400k installations on Packagist
‣ PHP5.6, PHP7.x and Opcache compatible
Go! AOP Framework
32
goaop/framework
‣ Inspired by famous AspectJ and Spring Java frameworks
‣ Almost 1K stargazers on Github - thank you!
‣ Over 400k installations on Packagist
‣ PHP5.6, PHP7.x and Opcache compatible
‣ There are bridges for Symfony, Zend, Laravel…
Go! AOP Framework
32
goaop/framework
Let’s take our clean code one more time…
33
Let’s take our clean code one more time…
33
Let’s take our clean code one more time…
Method execution is an event!
33
…and subscribe to our event
34
…and subscribe to our event
34
…and subscribe to our eventPointcut - describes list of
interesting events
34
…and subscribe to our eventPointcut - describes list of
interesting events
34
Joinpoint - defines an event
object
…and subscribe to our eventPointcut - describes list of
interesting events
Advice - event handler
34
Joinpoint - defines an event
object
Aspect VS Event Listener
35
Aspect VS Event Listener
35
Aspect VS Event Listener
35
Aspect VS Event Listener
35
Текст
How AOP works and modifies your original code?
37
All aspects (or advisors) are registered in the aspect kernel
37
All aspects (or advisors) are registered in the aspect kernel
38
The special php://filter stream filter is registered via
stream_filter_register()
39
The composer class loader is replaced with a weaving
proxy
40
Lexical analysis and parsing of source code into the AST is
performed
(nikic/PHP-Parser)
41
Static reflection is created from the AST
(goaop/parser-reflection)
41
Static reflection is created from the AST
(goaop/parser-reflection)
41
Static reflection is created from the AST
(goaop/parser-reflection)
41
Static reflection is created from the AST
(goaop/parser-reflection)
42
The original class is renamed and replaced with a new class
with additional behavior; stored in the cache
42
The original class is renamed and replaced with a new class
with additional behavior; stored in the cache
42
The original class is renamed and replaced with a new class
with additional behavior; stored in the cache
Same class name!
42
The original class is renamed and replaced with a new class
with additional behavior; stored in the cache
Original class renamedSame class name!
42
The original class is renamed and replaced with a new class
with additional behavior; stored in the cache
Original class renamed
Overridden method
Same class name!
Текст
Go! AOP joinpoints
Method interceptors:
44
Method interceptors:
44
Method interceptors:
44
Can be a final class or a trait!
Method interceptors:
44
Method interceptors:
44
Method interceptors:
44
Property interceptors:
45
Property interceptors:
45
Property interceptors:
45
Property interceptors:
45
Logic interceptors:
46
AOP
47
AOP
47
+ Keeps SRP for the original class because it doesn’t contain
secondary concerns now
AOP
47
+ Keeps SRP for the original class because it doesn’t contain
secondary concerns now
+ All secondary concerns are stored in separate classes
without duplication (SRP for secondary concerns)
AOP
47
+ Keeps SRP for the original class because it doesn’t contain
secondary concerns now
+ All secondary concerns are stored in separate classes
without duplication (SRP for secondary concerns)
+ Very flexible way of extending our system (like mediator
does)
AOP
47
+ Keeps SRP for the original class because it doesn’t contain
secondary concerns now
+ All secondary concerns are stored in separate classes
without duplication (SRP for secondary concerns)
+ Very flexible way of extending our system (like mediator
does)
+ Does not require changes in original classes 👍
- No tools to debug AOP code; no help from IDE
AOP
47
+ Keeps SRP for the original class because it doesn’t contain
secondary concerns now
+ All secondary concerns are stored in separate classes
without duplication (SRP for secondary concerns)
+ Very flexible way of extending our system (like mediator
does)
+ Does not require changes in original classes 👍
- No tools to debug AOP code; no help from IDE
- Overhead for AOP initialization and execution
AOP
47
+ Keeps SRP for the original class because it doesn’t contain
secondary concerns now
+ All secondary concerns are stored in separate classes
without duplication (SRP for secondary concerns)
+ Very flexible way of extending our system (like mediator
does)
+ Does not require changes in original classes 👍
48
- No tools to debug AOP code
- No help from IDE
48
- No tools to debug AOP code
- No help from IDE
Plugin for the PhpStorm 👍
49
Plugin for the PhpStorm 👍
49
Debugging with XDebug
50
Debugging with XDebug
50
Pointcut syntax highlighting, completion
and analysis
51
Pointcut syntax highlighting, completion
and analysis
51
Navigate to advice/advised elements
52
Navigate to advice/advised elements
52
Текст
Logging
Automatic logging of methods execution
Step 1. Define an annotation
54
Step 1. Define an annotation
54
Step 2. Define an aspect
55
Step 2. Define an aspect
55
Step 2. Define an aspect
56
Step 2. Define an aspect
56
Step 2. Define an aspect
56
All methods with «Loggable» annotation
Step 2. Define an aspect
56
All arguments for this method call
Step 2. Define an aspect
56
All parameter names (Reflection)
Step 2. Define an aspect
56
Preparing context for logging
Step 2. Define an aspect
56
Log this information
Step 3. Use it in your code
57
Step 3. Use it in your code
57
Import «Loggable» annotation
Step 3. Use it in your code
57
Define additional log info
Текст
Caching
Automatic caching of methods
Step 1. Define an annotation
59
Step 2. Define an aspect
60
Step 2. Define an aspect
60
Step 2. Define an aspect
60
All methods with «Cacheable» annotation
Step 2. Define an aspect
60
Calculate cache key and check it
Step 2. Define an aspect
60
Execute original method
Step 2. Define an aspect
60
Step 3. Use it in your code
61
Step 3. Use it in your code
61
Step 3. Use it in your code
61
Define additional cache info
Текст
Async methods
Runtime transformation of methods into async methods
Step 1. Define an annotation
63
Step 2. Define an aspect
64
Step 2. Define an aspect
64
Step 2. Define an aspect
64
All methods with «Async» annotation
Step 2. Define an aspect
64
Record each call with arguments
Step 2. Define an aspect
64
Prevent execution of original method
Step 2. Define an aspect
64
Return «our» value
Step 2. Define an aspect
65
Step 2. Define an aspect
65
Step 2. Define an aspect
65
Step 2. Define an aspect
65
Step 2. Define an aspect
65
Finish FASTCGI Request
Step 2. Define an aspect
65
Execute delayed methods
More examples for AOP
66
More examples for AOP
66
‣ Profiling methods with pinba extension and Intaro
Pinboard
More examples for AOP
66
‣ Profiling methods with pinba extension and Intaro
Pinboard
‣ Feature toggle pattern
More examples for AOP
66
‣ Profiling methods with pinba extension and Intaro
Pinboard
‣ Feature toggle pattern
‣ Authorization control
More examples for AOP
66
‣ Profiling methods with pinba extension and Intaro
Pinboard
‣ Feature toggle pattern
‣ Authorization control
‣ Traditional transaction control, security audit
More examples for AOP
66
‣ Profiling methods with pinba extension and Intaro
Pinboard
‣ Feature toggle pattern
‣ Authorization control
‣ Traditional transaction control, security audit
‣ Design by contract programming (Php-Deal library)
More examples for AOP
66
‣ Profiling methods with pinba extension and Intaro
Pinboard
‣ Feature toggle pattern
‣ Authorization control
‣ Traditional transaction control, security audit
‣ Design by contract programming (Php-Deal library)
‣ Aspect-oriented testing (AspectMock)
Conclusion
67
Conclusion
67
‣ OOP is a nice tool for solving accidental complexity but
not for essential complexity.
Conclusion
67
‣ OOP is a nice tool for solving accidental complexity but
not for essential complexity.
‣ Pay attention to code scattering and code tangling.
Conclusion
67
‣ OOP is a nice tool for solving accidental complexity but
not for essential complexity.
‣ Pay attention to code scattering and code tangling.
‣ Try to extract secondary concerns into separate classes
via OOP decomposition for small applications.
Conclusion
67
‣ OOP is a nice tool for solving accidental complexity but
not for essential complexity.
‣ Pay attention to code scattering and code tangling.
‣ Try to extract secondary concerns into separate classes
via OOP decomposition for small applications.
‣ Try to use AOP for complex enterprise applications.
Thank you for the attention!
https://github.com/goaop
https://github.com/lisachenko
https://twitter.com/lisachenko

More Related Content

What's hot (20)

PDF
Wahckon[2] - iOS Runtime Hacking Crash Course
eightbit
 
PDF
Coder sans peur du changement avec la meme pas mal hexagonal architecture
Thomas Pierrain
 
PDF
Can you TDD Rails?
Andrzej Krzywda
 
PPTX
Rails automatic test driven development
tyler4long
 
PPTX
Coding Standard And Code Review
Milan Vukoje
 
PPTX
Intro to kotlin
Tomislav Homan
 
PPT
laravel Elegant artisan by santosh pawar
Santosh Pawar
 
PDF
Testing sync engine
Ilya Puchka
 
PDF
Challenges of moving a java team to scala
João Cavalheiro
 
PDF
iOS: Optimizando código con RxSift
Belatrix Software
 
PDF
Implementation of TypeGraphQL with Apollo Server
Fabien Pasquet
 
PDF
QA / Testing Tools, Automation Testing, Online & Classroom Training
AnanthReddy38
 
PDF
Introduction to Scala Implicits, Pimp my library and Typeclasses
Jordi Pradel
 
PDF
Scala Bay Meetup - The state of Scala code style and quality
Jaime Jorge
 
PDF
Robot framework - Lord of the Rings
Asheesh Mehdiratta
 
PPTX
Aop With Post Sharp
Lance Zhang
 
PDF
Java EE 7 meets Java 8
Roberto Cortez
 
PPTX
Nodejs from zero to hero
Nicola Del Gobbo
 
ODP
ActiveRecord is good enough
srigi
 
PDF
Tips and Tricks for Testing Lambda Expressions in Android
David Carver
 
Wahckon[2] - iOS Runtime Hacking Crash Course
eightbit
 
Coder sans peur du changement avec la meme pas mal hexagonal architecture
Thomas Pierrain
 
Can you TDD Rails?
Andrzej Krzywda
 
Rails automatic test driven development
tyler4long
 
Coding Standard And Code Review
Milan Vukoje
 
Intro to kotlin
Tomislav Homan
 
laravel Elegant artisan by santosh pawar
Santosh Pawar
 
Testing sync engine
Ilya Puchka
 
Challenges of moving a java team to scala
João Cavalheiro
 
iOS: Optimizando código con RxSift
Belatrix Software
 
Implementation of TypeGraphQL with Apollo Server
Fabien Pasquet
 
QA / Testing Tools, Automation Testing, Online & Classroom Training
AnanthReddy38
 
Introduction to Scala Implicits, Pimp my library and Typeclasses
Jordi Pradel
 
Scala Bay Meetup - The state of Scala code style and quality
Jaime Jorge
 
Robot framework - Lord of the Rings
Asheesh Mehdiratta
 
Aop With Post Sharp
Lance Zhang
 
Java EE 7 meets Java 8
Roberto Cortez
 
Nodejs from zero to hero
Nicola Del Gobbo
 
ActiveRecord is good enough
srigi
 
Tips and Tricks for Testing Lambda Expressions in Android
David Carver
 

Similar to Solving cross cutting concerns in PHP - PHPSerbia-2017 (20)

PPTX
Aspect-oriented programming
MohamadHayeri1
 
PPT
AOP-IOC made by Vi Quoc Hanh and Vu Cong Thanh in SC Team
Thuy_Dang
 
PPTX
Aspect Oriented Programming
Shreya Chatterjee
 
PPTX
Spring AOP in Nutshell
Onkar Deshpande
 
PPTX
Performance analysis of synchronisation problem
harshit200793
 
PPTX
Introduction to Aspect Oriented Programming (DDD South West 4.0)
Yan Cui
 
PPT
Aop2007
Tuhin_Das
 
PPT
Aspect Oriented Programming
Anumod Kumar
 
PDF
Spring aop
Hamid Ghorbani
 
PPTX
Aspect Oriented Programming
Rodger Oates
 
PPT
Aspect Oriented Software Development
Jignesh Patel
 
PPTX
Introduction to Aspect Oriented Programming
Yan Cui
 
PDF
From class to architecture
Marcin Hawraniak
 
PDF
Aspect Oriented Development
tyrantbrian
 
KEY
Spring AOP
Jeroen Rosenberg
 
PDF
IRJET- A Design Approach for Basic Telecom Operation
IRJET Journal
 
PDF
Aspect Oriented Programming and MVC with Spring Framework
Massimiliano Dessì
 
PDF
Aspect-Oriented Programming and Depedency Injection
Robert Lemke
 
PPTX
Spring AOP
Radhakrishna Mutthoju
 
Aspect-oriented programming
MohamadHayeri1
 
AOP-IOC made by Vi Quoc Hanh and Vu Cong Thanh in SC Team
Thuy_Dang
 
Aspect Oriented Programming
Shreya Chatterjee
 
Spring AOP in Nutshell
Onkar Deshpande
 
Performance analysis of synchronisation problem
harshit200793
 
Introduction to Aspect Oriented Programming (DDD South West 4.0)
Yan Cui
 
Aop2007
Tuhin_Das
 
Aspect Oriented Programming
Anumod Kumar
 
Spring aop
Hamid Ghorbani
 
Aspect Oriented Programming
Rodger Oates
 
Aspect Oriented Software Development
Jignesh Patel
 
Introduction to Aspect Oriented Programming
Yan Cui
 
From class to architecture
Marcin Hawraniak
 
Aspect Oriented Development
tyrantbrian
 
Spring AOP
Jeroen Rosenberg
 
IRJET- A Design Approach for Basic Telecom Operation
IRJET Journal
 
Aspect Oriented Programming and MVC with Spring Framework
Massimiliano Dessì
 
Aspect-Oriented Programming and Depedency Injection
Robert Lemke
 
Ad

Recently uploaded (20)

PDF
Alpha Altcoin Setup : TIA - 19th July 2025
CIFDAQ
 
PDF
Upskill to Agentic Automation 2025 - Kickoff Meeting
DianaGray10
 
PDF
CIFDAQ'S Token Spotlight for 16th July 2025 - ALGORAND
CIFDAQ
 
PDF
RAT Builders - How to Catch Them All [DeepSec 2024]
malmoeb
 
PDF
UiPath vs Other Automation Tools Meeting Presentation.pdf
Tracy Dixon
 
PPTX
Top Managed Service Providers in Los Angeles
Captain IT
 
PDF
Rethinking Security Operations - Modern SOC.pdf
Haris Chughtai
 
PDF
How ETL Control Logic Keeps Your Pipelines Safe and Reliable.pdf
Stryv Solutions Pvt. Ltd.
 
PDF
visibel.ai Company Profile – Real-Time AI Solution for CCTV
visibelaiproject
 
PPTX
AI Code Generation Risks (Ramkumar Dilli, CIO, Myridius)
Priyanka Aash
 
PDF
TrustArc Webinar - Navigating Data Privacy in LATAM: Laws, Trends, and Compli...
TrustArc
 
PPTX
Building and Operating a Private Cloud with CloudStack and LINBIT CloudStack ...
ShapeBlue
 
PDF
OpenInfra ID 2025 - Are Containers Dying? Rethinking Isolation with MicroVMs.pdf
Muhammad Yuga Nugraha
 
PDF
Meetup Kickoff & Welcome - Rohit Yadav, CSIUG Chairman
ShapeBlue
 
PDF
Integrating IIoT with SCADA in Oil & Gas A Technical Perspective.pdf
Rejig Digital
 
PPTX
Extensions Framework (XaaS) - Enabling Orchestrate Anything
ShapeBlue
 
PPTX
Machine Learning Benefits Across Industries
SynapseIndia
 
PDF
Productivity Management Software | Workstatus
Lovely Baghel
 
PDF
Novus Safe Lite- What is Novus Safe Lite.pdf
Novus Hi-Tech
 
PDF
NewMind AI Weekly Chronicles – July’25, Week III
NewMind AI
 
Alpha Altcoin Setup : TIA - 19th July 2025
CIFDAQ
 
Upskill to Agentic Automation 2025 - Kickoff Meeting
DianaGray10
 
CIFDAQ'S Token Spotlight for 16th July 2025 - ALGORAND
CIFDAQ
 
RAT Builders - How to Catch Them All [DeepSec 2024]
malmoeb
 
UiPath vs Other Automation Tools Meeting Presentation.pdf
Tracy Dixon
 
Top Managed Service Providers in Los Angeles
Captain IT
 
Rethinking Security Operations - Modern SOC.pdf
Haris Chughtai
 
How ETL Control Logic Keeps Your Pipelines Safe and Reliable.pdf
Stryv Solutions Pvt. Ltd.
 
visibel.ai Company Profile – Real-Time AI Solution for CCTV
visibelaiproject
 
AI Code Generation Risks (Ramkumar Dilli, CIO, Myridius)
Priyanka Aash
 
TrustArc Webinar - Navigating Data Privacy in LATAM: Laws, Trends, and Compli...
TrustArc
 
Building and Operating a Private Cloud with CloudStack and LINBIT CloudStack ...
ShapeBlue
 
OpenInfra ID 2025 - Are Containers Dying? Rethinking Isolation with MicroVMs.pdf
Muhammad Yuga Nugraha
 
Meetup Kickoff & Welcome - Rohit Yadav, CSIUG Chairman
ShapeBlue
 
Integrating IIoT with SCADA in Oil & Gas A Technical Perspective.pdf
Rejig Digital
 
Extensions Framework (XaaS) - Enabling Orchestrate Anything
ShapeBlue
 
Machine Learning Benefits Across Industries
SynapseIndia
 
Productivity Management Software | Workstatus
Lovely Baghel
 
Novus Safe Lite- What is Novus Safe Lite.pdf
Novus Hi-Tech
 
NewMind AI Weekly Chronicles – July’25, Week III
NewMind AI
 
Ad

Solving cross cutting concerns in PHP - PHPSerbia-2017