AOP 切面编程思想
不知不觉潮流变成了怀旧
AOP思想 - 切面思想 Aspect Oriented Programming,通过动态代理等技术实现程序功能的统一维护的一种技术。
面向对象 OOP设计原则是:
1、把应用程序分解成若干的对象
2、高内聚
3、弱耦合
比如说,
应用程序里很多业务逻辑都要在操作之初进行“权限检查”,在操作之后进行“日志记录”,
如果直接把处理这些操作的代码加入到每个模块中,那么无疑破坏了OOP的“单一职责”原则,模块的可重用性会大大降低,
这时候传统的OOP设计往往采取的策略是加入相应的代理(Proxy)层来完成系统的功能要求,但这样的处理明显使系统整体增加了一个层次的划分,复杂性也随之增加,从而给人过于厚重的感觉
为了处理上面的问题,AOP(面向方面编程:Aspect-Oriented Programming)思想应运而生了,
假设把应用程序想成一个立体结构的话,OOP的利刃是纵向切入系统,把系统划分为很多个模块(如:用户模块,文章模块等等),
而AOP的利刃是横向切入系统,提取各个模块可能都要重复操作的部分(如:权限控制,日志记录,性能检测,事务控制等)。
由此可见,AOP是OOP的一个有效补充。
AOP实现原理
AOP主要通过代理模式来实现。具体来说,它通过在运行时生成代理对象来将切面织入到目标对象中,从而实现对目标对象的增强和修改。
代理模式主要分为静态代理和动态代理两种。静态代理是在编译期就确定好代理类,而动态代理是在运行期根据需要生成代理对象。在PHP中,动态代理多采用魔术方法(Magic Method)和__call()函数来实现。
实现方式
- 前置通知
- 后置通知
- 环绕通知
- 异常处理通知
- 最终通知
常用的框架和工具
- Go! AOP:一个轻量级的基于切面的PHP框架。支持前置、后置和环绕通知,而且非常易于使用。
- PHP-Aspect:一个完全基于PHP的AOP框架。它支持所有五种通知类型和AspectJ风格的切入点,另外还提供了注解方式的AOP实现。
- AspectMock:一个使用PHPUnit和Go! AOP实现AOP的库。它可以在测试中模拟任意对象,并支持AOP调试。
- Guzzle AOP:一个基于Guzzle HTTP客户端的AOP插件。它可以对Guzzle发起的请求进行统一的日志、错误处理、缓存和重试等管理。
除了以上框架和工具外,还有一些基于代理模式的AOP库,如PHP Proxy和ProxyManager等。