php

位置:IT落伍者 >> php >> 浏览文章

PHP系列学习之AOP[1]


发布日期:2018年09月18日
 
PHP系列学习之AOP[1]

介绍

你以前听说过AOP(Aspect Oriented Programming)吗?虽然在php方面好像没有过多的使用但是在企业级开发中AOP被广泛使用我将借此文向大家介绍PHP方面的AOP

这篇文章主要解释AOP的概念

什么是AOP?

在应用开发中我们经常发现需要很多功能这些功能需要经常被分散在代码中的多个点上但是这些点事实上跟实际业务没有任何关联比如在执行一些特殊任务之前需要确保用户是在登陆状态中我们把这些特殊人物就叫做crosscutting concerns让我们通过Wikipedia来了解一下crosscutting concerns(横向关系)的定义

在计算机科学中crosscutting 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()中crosscutting concerns应该在执行验证逻辑之前和发送信息给管理员之后发生这些都可能是接入点

在你的应用代码中接入点可以放置在任何位置但是Advice仅能在某些点中布置这要根据你的AOP框架过后我会讨论

Pointcut(点切割)

点切割定义了一种把通知匹配到某些接入点的方式虽然在我们的例子中只有一对接入点但是在你的应用中你可以放置上千个接入点你也不需要把通知应用到所有的接入点上你可以把一些你认为有必要的接入点绑定到通知上

假设我们想要通知 createPost()approvePost() 和 editPost()但是现在没有viewPost()我们使用某种方法把这三种方法绑定到通知上之后我们创建一个包含切面细节的XML文件这些细节包含一些匹配接入点的正则表达式

总结当有横向切入关系存在于我们的应用的时候我们可以创建一个切面这个切面在一些选择使用点切割的接入点上应用通知功能

[] []

               

上一篇:PHP系列学习之AOP[2]

下一篇:PHP系列学习之日期函数[2]