一、AOP是什么? 面向切面编程,通过预编译方式或运行期动态代理实现程序功能的统一维护的一种技术。 AOP在字面上与OOP很相似,但设计思想在目标上有着本质的差异。 OOP是针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。 而AOP则是针对业务处理过程中的黄页进行提取,它所面对的是处理过程中的某个步骤或阶段,以获取逻辑过程中各部分之间低耦合性的隔离效果。 二、 Hyperf里的AOP 只需要理解一个概念,即Aspect(切面) Aspect可以切入任意类或任意注解类 被切入的类必须由DI管理 相对于其它框架实现的AOP功能的使用方式,进一步简化了AOP的使用,不做过细的划分(如,Before, After, AfterReturning, AfterThrowing),仅存在环绕(Around)一种通过的形式。 Hyperf的AOP是基于DI实现的 必须使用的是Hyperf的DI组件,即hyperf/di 必须通过DI创建的对象才能使AOP生效,直接new不行 必须当代理类缓存文件不存在时,才会重新生成代理类 三、AOP的应用场景 参数校验、日志、无侵入埋点、安全控制、性能统计、事务处理、异常处理、缓存、无侵入监控、资源池、连接池管理等。 四、Aspect示例 1. 切入服务类 作用于所有引入该服务类的位置 <?php namespace App\Aspect; use App\Service\SomeClass; use App\Annotation\SomeAnnotation; use Hyperf\Di\Annotation\Aspect; use Hyperf\Di\Aop\AbstractAspect; use Hyperf\Di\Aop\ProceedingJoinPoint; #[Aspect] class FooAspect extends AbstractAspect { // 要切入的类,可以多个,也可通过 :: 标识到具体的某个方法,通过 * 可以模糊匹配 public $classes = [