当前位置: 首页 > 后端技术 > PHP

你知道AOP是什么吗?

时间:2023-03-29 18:25:56 PHP

前言AOP的全称是AspectOrientedProgramming,意思是:面向方面的编程。为什么会有这篇文章?是因为看了Laravel中Pipeline的设计,发现Pipeline是基于AOP思想的实现。说到AOP就不得不说到OOP,它们之间有什么关系,有什么区别?AOP和OOP的区别OOP我们都知道整个过程是ObjectOrientedProgramming,意思是:面向对象编程。首先我们要知道AOP和OOP并不是对立的。AOP可以看作是弥补了OOP的不足,从而弥补了对方的不足。两者结合效果最好。OOP是对业务实体及其属性和行为的抽象封装,这不难理解,比如:用户模块、订单模块等。AOP的目的是抽取业务方面。它是面向处理过程中的某个步骤或阶段,从而达到逻辑处理过程中各个部分之间低耦合的隔离效果,例如:日志记录、权限验证等。用一个例子就很容易理解.如果单纯使用OOP,如果需要在日志模块和订单模块中进行权限验证和日志记录怎么办?是否需要在每个方法前添加权限验证和日志记录代码?那么,如果您需要在每个方法之前和之后进行记录怎么办?这时候如果使用AOP,就可以使用代理来完成这些重复的操作,不需要在每个方法前添加权限验证和日志记录代码,降低了各个部分之间的耦合度。AOP能做什么除了上面说的权限校验和日志记录,AOP还可以做数据加解密,请求响应数据规范……只要和具体业务无关即可,同时业务是关注点,那么就可以用AOP把这些关注点抽取出来,统一维护,提高代码复用性。上面的业务关注点是不是有点似曾相识……其实我们常用的路由中间件就是基于AOP思想的一种实现。AOP实现的一个例子:Laravel中的路由中间件。/***通过中间件/路由器发送给定的请求。**@param\Illuminate\Http\Request$request*@return\Illuminate\Http\Response*/protectedfunctionsendRequestThroughRouter($request){$this->app->instance('request',$request);}Facade::clearResolvedInstance('request');$this->bootstrap();return(newPipeline($this->app))->send($request)->through($this->app->shouldSkipMiddleware()?[]:$this->middleware)->then($this-复制代码>dispatchToRouter());}通过上面的代码可以发现,需要执行的中间件配置在through()方法中,执行完then方法。上面的代码是在路由中间件中使用的,当然也可以在其他地方使用,比如在controller中,可以这样写://示例代码$pipes=[LoggingPipeline::class,//LoggingPermitPipeline::class,//权限验证];returnapp(Pipeline::class)->send($request->all())->through($pipes)->then(function($content){return$content;});以上只是Laravel中的一种实现,当然在PHP的其他框架中也有类似的实现,如:Yii、ThinkPHP等。AOP只是一种思路,当然还有其他语言的实现,如Golang和爪哇。推荐阅读,编程是一种思考,而不是敲代码做业务系统开发。如何做到认真负责?