PHP网页设计PHP系列进修之AOP
一些真正的强人总会搞出新玩意来丢给你,你不学就落后了,也印证了前人的经验,果然是学无止境啊!引见
你之前传闻过AOP(Aspect Oriented Programming)吗?固然在php方面,仿佛没有过量的利用,然而在企业级开辟中,AOP被普遍利用。我将借此文,向人人引见PHP方面的AOP。
这篇文章次要注释AOP的概念。
甚么是AOP?
在使用开辟中,咱们常常发明需求良多功效,这些功效需求常常被分离在代码中的多个点上,然而这些点现实上跟实践营业没有任何干联。好比,在履行一些特别义务之前需求确保用户是在上岸形态中,咱们把这些特别人物就叫做"cross-cutting concerns",让咱们经由过程Wikipedia来懂得一下"cross-cutting concerns"(横向关系)的界说。
在盘算机迷信中,"cross-cutting concerns"指的是“切面(或偏向)编程”。这些关系不克不及从其他体系(框架设计或某些完成)中很好的分化出来,以致于呈现代码反复,在体系中存在成心义的依附关系,或二者兼有之。
如今你关于“横向关系”应当有一个基本的熟悉,让咱们看看他们在代码中是怎样的?
假定一种场景,你是一个博客站点的编纂。你需求上岸站点,然落后行创立帖子,验证帖子,编纂帖子等等。假如你没有上岸,那末你应当直接到上岸界面。为了确保这些行动是平安的,以上的任何操作都需求停止无效验证,代码以下。
[*] <?php
[*] 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的功效。这个全局的掌握器运转在全部体系里,并且对咱们是不成见的。
[*] <?php
[*] class PathController
[*] {
[*] function controlPaths($className, $funcName) {
[*] Authentication::checkAuthentication();
[*] $classObj = new $className();
[*] $classObj->$funcName();
[*] }
[*] }
在这里假定有这么一个类,次要是用于给你展示这个类实践上产生了甚么工作。假定谁人controlPaths办法是使用中全局切入点,会见使用中的每一个办法都需求经由过程这个办法会见。下面的办法中在履行每一个办法之前,咱们挪用了告诉checkAuthentication()。——这就是前告诉。
前往后告诉
这个告诉在指定功效履行完后只履行一次,而且前往谁人会见点。思索上面的代码:
[*] <?php
[*] class PathController
[*] {
[*] function controlPaths($className, $funcName) {
[*] $classObj = new $className();
[*] $classObj->$funcName();
[*] Database::closeConnection();
[*] }
[*] }
注重这里,当办法完成以后,咱们清算了数据库资本。在前往告诉以后,咱们挪用这个告诉。
抛出后告诉
假如在履行历程时代函数抛出异常,那末在抛出完异常以后使用告诉。这里是抛出完异常以后,告诉就酿成毛病提醒。
[*] <?php
[*] class PathController
[*] {
[*] function controlPaths($className, $funcName) {
[*] try {
[*] $classObj = new $className();
[*] $classObj->$funcName();
[*] }
[*] catch (Exception $e) {
[*] Error::reportError();
[*] }
[*] }
[*] }
周边告诉
第四种告诉是周边告诉,他是前告诉和前往后告诉的兼并体。
[*] <?php
[*] class PathController
[*] {
[*] function controlPaths($className, $funcName) {
[*] Logger::startLog();
[*] $classObj = new $className();
[*] $classObj->$funcName();
[*] Logger::endLog();
[*] }
[*] }
怎么培养啊 别光说不练啊,好 ,比如新人入门自己步是配置环境,虽然现在都有很多的集成环境,但是真实的体验下配置环境还是会有很多帮助,不论是你以后工作还是在真实的linux下开发。 对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。 作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。 建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。 php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会) 使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的 做为1门年轻的语言,php一直很努力。 其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎 因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax 个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。 先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。 其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。 微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox支持的不是很好,所以能少用还是少用的好。 当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标, 至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。 如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域, 我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。 个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。 实践是检验自己会不会的真理。 为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
页:
[1]
2