|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
一些真正的强人总会搞出新玩意来丢给你,你不学就落后了,也印证了前人的经验,果然是学无止境啊!
引见
你之前传闻过AOP(Aspect Oriented Programming)吗?固然在php方面,仿佛没有过量的利用,然而在企业级开辟中,AOP被普遍利用。我将借此文,向人人引见PHP方面的AOP。
这篇文章次要注释AOP的概念。
甚么是AOP?
在使用开辟中,咱们常常发明需求良多功效,这些功效需求常常被分离在代码中的多个点上,然而这些点现实上跟实践营业没有任何干联。好比,在履行一些特别义务之前需求确保用户是在上岸形态中,咱们把这些特别人物就叫做"cross-cutting concerns",让咱们经由过程Wikipedia来懂得一下"cross-cutting concerns"(横向关系)的界说。
在盘算机迷信中,"cross-cutting concerns"指的是“切面(或偏向)编程”。这些关系不克不及从其他体系(框架设计或某些完成)中很好的分化出来,以致于呈现代码反复,在体系中存在成心义的依附关系,或二者兼有之。
如今你关于“横向关系”应当有一个基本的熟悉,让咱们看看他们在代码中是怎样的?
假定一种场景,你是一个博客站点的编纂。你需求上岸站点,然落后行创立帖子,验证帖子,编纂帖子等等。假如你没有上岸,那末你应当直接到上岸界面。为了确保这些行动是平安的,以上的任何操作都需求停止无效验证,代码以下。
- class BlogPost extends CI_Controller
- {
- public function createPost() {
- if (!Authentication::checkAuthentication()) {
- // redirect to login
- }
- else {
- // proceed
- Messages::notifyAdmin();
- }
- }
-
- public function approvePost() {
- if (!Authentication::checkAuthentication()) {
- // redirect to login
- }
- else {
- // proceed
- }
- }
-
- public function editPost() {
- if (!Authentication::checkAuthentication()) {
- // redirect to login
- }
- else {
- // proceed
- }
- }
-
- public function viewPost() {
- // ...
- }
- }
看下面的代码,你会发明在每一个办法之前都挪用了checkAuthentication(),由于这些行动需求用户上岸以后才干停止。还有就是notifyAdmin()来分辨是不是是办理员帐号,以便创立新贴。看见没有,有良多“反复的代码”,并且BlogPost类,应当仅担任办理帖子。验证和分辨身份应该是分别的。咱们违背了“单一职责准绳”。
单一职责准绳讲述的是每一个类应当只要单一的义务(义务),并且应当把全部义务都封装在一个类中。一切办事应当依照职责严谨而平衡的停止散布。
迄今为止,咱们可以分明AOP所表达的意思。横向切面关系被成组的放进一个类中,咱们管这个类叫“切面”。从咱们中心代码平分离横向切面关系的进程就叫做Aspect Oriented Programming。
AOP专业术语
有良多前提专门用于注释AOP的特征。了解这些前提将是你胜利把AOP集成到你的项目中的钥匙
Aspect;Advice;Joinpoint;Pointcut
咱们已进修到切面(Aspect)是甚么!如今让咱们懂得一下其他三个前提意味着甚么?
Advice(告诉)
Advice用于挪用Aspect(切面),正如其名所暗示,Advice用于界说某种情形下做甚么和甚么工夫做这件工作。在咱们之前的例子中,checkAuthentication(做甚么)是advice(告诉),在指定办法中它应当在履行代码之前(甚么工夫)被挪用。
Joinpoint(接入点)
Joinpoint是咱们创立Advice使用中的地位。再翻看之前的代码,你会发明我挪用了几个与营业逻辑没有直接联系关系的功效。在createPost()中,如,cross-cutting concerns应当在履行验证逻辑之前和发送信息给办理员以后产生。这些都多是接入点。
在你的使用代码中,接入点可以放置在任何地位。然而Advice仅能在某些点中安排,这要依据你的AOP框架,事后我会会商。
Pointcut(点切割)
点切割界说了一种把告诉婚配到某些接入点的体例。固然在咱们的例子中只要一对接入点,然而在你的使用中你可以放置上千个接入点,你也不需求把告诉使用到一切的接入点上。你可以把一些你以为有需要的接入点绑定到告诉上。
假定咱们想要告诉 createPost(),approvePost() 和 editPost(),然而如今没有viewPost()。咱们利用某种办法把这三种办法绑定到告诉上。以后咱们创立一个包括切面细节的XML文件,这些细节包括一些婚配接入点的正则表达式。
总结:当有横向切入关系存在于咱们的使用的时分,咱们可以创立一个切面,这个切面在一些选择利用点切割的接入点上使用告诉功效。
AOP 告诉类型
告诉代码咱们可以用良多中体例体现。我之条件到,这些告诉代码依附你利用的框架,然而有些你需求熟习的类型,请看上面:
前告诉;前往后告诉;抛出后告诉;周边告诉
前告诉
在你的代码中一些特别点之前利用告诉——正常是挪用一个办法。
迄今为止,为了简化概念和为了让你更快的了解你的代码,我常常把告诉写到办法里。然而在真实的情况里,告诉常常是不写在办法里的。应当有一个自力的掌握器,每一个办法都在这个掌握器里,并且每一个办法都包裹着AOP的功效。这个全局的掌握器运转在全部体系里,并且对咱们是不成见的。
- class PathController
- {
- function controlPaths($className, $funcName) {
- Authentication::checkAuthentication();
- $classObj = new $className();
- $classObj->$funcName();
- }
- }
在这里假定有这么一个类,次要是用于给你展示这个类实践上产生了甚么工作。假定谁人controlPaths办法是使用中全局切入点,会见使用中的每一个办法都需求经由过程这个办法会见。下面的办法中在履行每一个办法之前,咱们挪用了告诉checkAuthentication()。——这就是前告诉。
前往后告诉
这个告诉在指定功效履行完后只履行一次,而且前往谁人会见点。思索上面的代码:
- class PathController
- {
- function controlPaths($className, $funcName) {
- $classObj = new $className();
- $classObj->$funcName();
- Database::closeConnection();
- }
- }
注重这里,当办法完成以后,咱们清算了数据库资本。在前往告诉以后,咱们挪用这个告诉。
抛出后告诉
假如在履行历程时代函数抛出异常,那末在抛出完异常以后使用告诉。这里是抛出完异常以后,告诉就酿成毛病提醒。
- class PathController
- {
- function controlPaths($className, $funcName) {
- try {
- $classObj = new $className();
- $classObj->$funcName();
- }
- catch (Exception $e) {
- Error::reportError();
- }
- }
- }
周边告诉
第四种告诉是周边告诉,他是前告诉和前往后告诉的兼并体。
- class PathController
- {
- function controlPaths($className, $funcName) {
- Logger::startLog();
- $classObj = new $className();
- $classObj->$funcName();
- Logger::endLog();
- }
- }
怎么培养啊 别光说不练啊,好 ,比如新人入门自己步是配置环境,虽然现在都有很多的集成环境,但是真实的体验下配置环境还是会有很多帮助,不论是你以后工作还是在真实的linux下开发。 |
|