仓酷云
标题:
PHP网页设计PHP系列进修之AOP
[打印本页]
作者:
第二个灵魂
时间:
2015-2-3 23:30
标题:
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下开发。
作者:
若相依
时间:
2015-2-4 00:04
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
作者:
小女巫
时间:
2015-2-8 06:16
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
作者:
不帅
时间:
2015-2-9 18:10
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
作者:
若天明
时间:
2015-2-9 19:09
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
作者:
分手快乐
时间:
2015-2-27 17:22
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
作者:
谁可相欹
时间:
2015-3-2 03:43
做为1门年轻的语言,php一直很努力。
作者:
飘飘悠悠
时间:
2015-3-9 02:23
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
作者:
变相怪杰
时间:
2015-3-16 20:10
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
作者:
因胸联盟
时间:
2015-3-23 00:04
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
作者:
海妖
时间:
2015-3-30 13:46
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
作者:
精灵巫婆
时间:
2015-4-1 13:09
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
作者:
莫相离
时间:
2015-4-2 22:47
微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox 支持的不是很好,所以能少用还是少用的好。
作者:
小妖女
时间:
2015-4-4 13:16
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
作者:
简单生活
时间:
2015-4-13 11:49
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
作者:
蒙在股里
时间:
2015-4-28 17:44
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
作者:
老尸
时间:
2015-4-29 19:28
我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。
作者:
兰色精灵
时间:
2015-5-2 00:13
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
作者:
冷月葬花魂
时间:
2015-5-5 06:19
实践是检验自己会不会的真理。
作者:
乐观
时间:
2015-5-11 22:08
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
作者:
金色的骷髅
时间:
2015-6-11 17:42
实践是检验自己会不会的真理。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2