您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

初探AOP FOR PHP_PHP教程

2025/11/13 0:42:44发布22次查看
问题
初探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]
然后自己简单实现了一下
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还没大懂呢。技术啊。追不上。
http://www.bkjia.com/phpjc/632517.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/632517.htmltecharticle问题 初探aop for php 解决方法 aop是oop的延续,是aspect oriented programming的缩写,意思是面向方面编程。aop实际是gof设计模式的延续,设计模式...
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product