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等。

posted @ 2021-05-19 09:57  方达达  阅读(186)  评论(0编辑  收藏  举报