PHP之AOP面向切面编程(勾子与行为)

方法一(映射)

/**
 * @param $name
 * @param $arguments
 * @return mixed|void
 * @throws ReflectionException
 */
public function __call($name, $arguments){
    //判断方法是否存在
    if (!method_exists(get_called_class(), $name)){
        return;
    }
    //判断权限
    //日志
    //调用方法
    $class = new ReflectionClass(get_called_class());
    $instance = $class->newInstance();
    $method = $class->getMethod($name);
    $method->setAccessible(true);
    return $method->invoke($instance);
}

方法二(CALL)

/** 不管用什么样的方式实现的AOP类,这部分逻辑是一样的,    
  * 执行目标方法之前,运行一些对象,(可有可无)    
  * 执行目标方法    
  * 执行目标方法之后,运行一些对象。(可有可无)    
  *     
  * 中间件, 代理, 都是同样的作用    
  */    
  try{    
      // before    
      if(isset($this->calls[$method]['before'])){    
          foreach ($this->calls[$method]['before'] as  $value) {    
              // if(!is_callable($value, $params)){    
              //     throw new Exception("call error", 1);    
              // }    
              call_user_func_array($value, $params);    
           }    
      }    
      $ret = call_user_func_array([$this->realSubject, $method], $params);    
      // $ret = $this->realSubject->$method($params); 
   
      //after    
      if(isset($this->calls[$method]['after'])){    
          foreach ($this->calls[$method]['after'] as  $value) {    
              call_user_func_array($value, $params);    
          }    
      }    
   }catch(\Exception $e) {    
      exit($e->getMessage());    
   }    
   return $ret;

方法三(CALL)

<?php

function foobar($arg, $arg2) {

echo __FUNCTION__, " got $arg and $arg2\n";

}

class foo {

function bar($arg, $arg2) {

echo __METHOD__, " got $arg and $arg2\n";

}

}

// Call the foobar() function with 2 arguments
call_user_func_array("foobar", array("one", "two"));

// Call the $foo->bar() method with 2 arguments
$foo = new foo;
call_user_func_array(array($foo, "bar"), array("three", "four"));

参考文章
https://blog.csdn.net/qq_22823581/article/details/86521551

https://github.com/liaoshengping/DesignPattern/tree/master/AspectOrientedProgramming

附反射详细说明

https://www.cnblogs.com/bndong/p/7988365.html

比较推荐的三方类库

https://github.com/lisachenko/go-aop-php

转载请注明出处:https://www.onexin.net/php-aop-2/

相关文章:

1、PHP AOP面向切面编程
https://www.onexin.net/php-aop/

2、用 PHP 编写更好的正则表达式regex
https://www.onexin.net/php-regex/

3、PHP 版本 8.2,8.1,8.0,7.4
https://www.onexin.net/php-8_2-8_1-8_0-7_4/

4、PHP中的Liskov替换原则
https://www.onexin.net/php-liskov/

5、php实现自运行的do实例详解
https://www.onexin.net/php-do/

Leave a Reply