当前位置:编程学习 > php >>

初探AOP FOR PHP



问题
初探AOP FOR PHP
解决方法


AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面编程。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。其实这个技术在很久前就出现了。我google的时候已经是06年就出现的技术。
用我的理解是,在不破坏原有方法或者类的时候将函数的进行横向切面。然后加进自己的方法处理。比如说,我们经常有一些方法执行之前要进行权限判断。处理之后要进行日志写入等等操作。一般的操作方式是在方法的头部和底部写处理过程。这就破坏了OOP的单一功能的原则。因为当有100甚至1000个方法要许进行同样处理的时候,难免会出现一些不必要的错误。这就是AOP的实际运用。。。
我们写一个函数输出一些信息的时候,在处理前,不希望没有权限看到这些信息的人来看。处理之后可能会写入一些常用缓存信息。通常的写法是这样 class OneTest{

public function getInfo(){

//检查一下权限

ACL::checkRole();

//做获取信息的动作过程;

.....

//写入缓存

Cache::writeCache();

}

}


复制代码如果有1000个这样需要做同样操作的方法怎么办呢。。一处修改处处修改。难维护的情况就出现了。而用AOP的办法去处理这个问题,就只需要这样 class OneTest{

public function getInfo(){

//做获取信息的动作过程;

.....

}

}


复制代码这样两个破坏封装的就拿出来在其他地方统一定义了。。。。。大体就是这么一个意思。当然理解错误,误人子弟纯属巧合。
详细介绍大家可以google。。一些资料还没整理。。。。。这还是忙里偷闲的时候整出来的。
下面是几个关于php的链接。有兴趣的可以看一下
AOP FOR PHP探讨
[url=http://blog.csdn.net/xiaoxiaohai123/archive/2008/06/30/2598377.aspx]链接标记http://blog.csdn.net/xiaoxiaohai123/archive/2008/06/30/2598377.aspx[/url]
PHP准AOP实现
[url=http://hi.baidu.com/thinkinginlamp/blog/item/864a0ef46d93b86eddc474f3.html]链接标记http://hi.baidu.com/thinkinginlamp/blog/item/864a0ef46d93b86eddc474f3.html[/url]
然后自己简单实现了一下

/**

* TSAspect{

* AOP for php

* @package

* @version $id$

* @copyright 2009-2011 SamPeng

* @author SamPeng <[email=sampeng87@gmail.com]sampeng87@gmail.com[/email]>

* @license PHP Version 5.2 {@link [url=http://www.sampeng.cn]www.sampeng.cn[/url]}

*/

class TSAspect{

/**

* instance

* 方法所属对象引用

* @var mixed

* @access private

*/

private $instance;

/**

* method

* 方法名

* @var mixed

* @access private

*/

private $method;



/**

* aspect

* 切面保存数组

* @var array

* @access private

*/

private $aspect = array();



/**

* __construct

* 构造函数查找出所有Aspect的实现方法

* @param mixed $instance

* @param mixed $method

* @param mixed $arg

* @access public

* @return void

*/

public function __construct( $instance,$method,$arg = null ){

$this->aspect = self::findFunction();

$this->instance = $instance;

$this->method = $method;

}



public function callAspect(){

$before_arg = $this->beforeFunction();

$callBack = array( $this->instance,$this->method);

$return = call_user_func_array( $callBack,$arg );

$this->afterFunction();

}





/**

* beforeFunction

* 方法之前执行的方法集合

* @static

* @access public

* @return void

*/

protected function beforeFunction(){

$result = $this->getFunction("before");

return $result;

}



/**

* afterFunction

* 方法之后执行的方法集合

* @static

* @access public

* @return void

*/

protected function afterFunction(){

$result = $this->getFunction( "after" );

}



/**

* findFunction

* 查找所有的Aspect的方法集合.

* @static

* @access private

* @return void

*/

private static function findFunction(){

$aspect = array();

foreach ( get_declared_classes() as $class ){

$reflectionClass = new ReflectionClass( $class );

if ( $reflectionClass->implementsInterface( 'InterfaceAspect' ) )

$aspect[] = $reflectionClass;

}

return $aspect;



}



/**

* getFunction

* 调用插入的方法

* @param mixed $aspect

* @static

* @access private

* @return void

*/

private function getFunction($aspect){

$result = array();

$array = $this->aspect;

foreach ( $array as $plugin ){

if ( $plugin->hasMethod($aspect ) ){

$reflectionMethod = $plugin->getMethod( $aspect );

if ( $reflectionMethod->isStatic() ){

$items = $reflectionMethod->invoke( null );

}else{

$pluginInstance = $plugin->newInstance();

$items = $reflectionMethod->invoke( $pluginInstance );

}

//处理经过处理的集合

if ( is_array( $items ) ){

$result = array_merge( $result,$items );

}

}

}

return $result;

}

}





interface InterfaceAspect{

public static function getName();

}



class testAspect implements InterfaceAspect{

public static function getName(){

return "这是一个测试AOP";

}



public static function before(){

echo "方法执行之前";

}

public static function after(){

echo "方法执行后
";

}

}



class test{

public function samTest($arg){

echo "这是一个测试方法";

}

}



$test = new test();

$aspect = new TSAspect($test,'samTest');

$aspect->callAspect();


复制代码输出:
方法执行之前
这是一个测试方法
方法执行之后


网友建意:
不懂,,,对开发思想有用不?
网友建意:
思想?这其实也是一种设计模式。。。。将破坏函数单一功能的部分耦合出来。。具体实现有很多办法。。当然PHP的是准AOP。。因为他不能像java那样的编译语言在编译时的时候插入横切面处理过程。
网友建意:
新的事物总是被人华丽的无视。。。
网友建意:
去年就知道面向切面编程了,,,用不上,,,,呵呵,,,
网友建意:
刚刚接触面向函数式编程,Haskell 、Erlang
网友建意:
PHP实现AOP要比Java简单的多..因为有runkit
网友建意:
自己连OOP还没大懂呢。技术啊。追不上。

补充:Php教程,常见问题 
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,