PHP AOP 面向切面

简介: 如果一个程序是一个管道系统,AOP 就是在管道上钻一些孔,在每个孔中注入新的代码流。 AOP 的实施分 3 步:切面分解、切面实现和切面合成。 OOP 只能沿继承树的纵向方向重用,AOP 可以沿横向方向重用。 AOP 面向切面编程 转载地址面向对象关注于每个对象定义的完整性切面是关注于整个对象系统的某个/某些特定功能面,比如日志、过滤等,把
  • 如果一个程序是一个管道系统,AOP 就是在管道上钻一些孔,在每个孔中注入新的代码流。
  • AOP 的实施分 3 步:切面分解、切面实现和切面合成。
  • OOP 只能沿继承树的纵向方向重用,AOP 可以沿横向方向重用。

AOP 面向切面编程 转载地址

  • 面向对象关注于每个对象定义的完整性
  • 切面是关注于整个对象系统的某个/某些特定功能面,比如日志、过滤等,把这些特定功能面剥离出来达到共用的目的

User.php

<?php

class User {
    private $name;

    function set_name($value) {
        $this->name = $value;
    }

    function get_name() {
        return $this->name;
    }
}

#$c1 = new User();
#$c1->set_name("Colin");
#$name = $c1->get_name();
#echo "name = ", $name, "\n";

?>

现在如果想在用户名字设置或读取的时候记录日志,该怎么做?
你可以创建一个动态的日志处理对象,把这个用户对象包装在其中,这样看起来用户对象的动作都会通知到其包装日志类一样

Logged.php

<?php

require_once(__dir__ . "/User.php");

class Logged {
    private $obj;

    function __call($method, $args) {
        echo $method, "(", join(",", $args), ")\n";
        return call_user_func_array(array(&$this->obj, $method), $args);
    }

    function __construct($obj) {
        $this->obj = $obj;
    }
}

$c1 = new Logged(new User());
$c1->set_name("Colin");
$name = $c1->get_name();
echo "name = ", $name, "\n";

?>

Output

set_name(Colin)
get_name()
name = Colin

调用代码还是一样,但这一次,任何对User方法的访问,都会被echo出来(你可以把echo替换其他的逻辑,如安全控制、日志记录、数据过滤等)

就好比在User对象的方法被调用时被某个钩子函数给挂载了,进行了预处理后置处理

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2月前
|
设计模式 SQL 运维
面向切面:AOP(1)
面向切面:AOP(1)
49 2
面向切面:AOP(1)
|
3月前
|
XML 设计模式 SQL
Spring6 面向切面(AOP)
Spring6 面向切面(AOP)
|
5月前
|
Java Spring
spring框架之AOP模块(面向切面),附带通知类型---超详细介绍
spring框架之AOP模块(面向切面),附带通知类型---超详细介绍
52 0
|
7月前
|
XML 缓存 监控
切面的魔力:解密Spring AOP 面向切面编程
切面的魔力:解密Spring AOP 面向切面编程
30 0
|
6月前
|
前端开发 Java 数据库连接
Spring Aop:面向切面编程
Spring Aop:面向切面编程
37 0
|
3月前
|
XML Java 数据格式
Spring 的AOP 简介,面向切面编程AOP
Spring 的AOP 简介,面向切面编程AOP
63 0
|
3月前
|
XML Java 数据格式
spring之面向切面:AOP(2)
【1月更文挑战第15天】 一、基于注解的AOP 1、技术说明 2、准备工作 3、创建切面类并配置 4、各种通知 5、切入点表达式语法 6、重用切入点表达式 7、获取通知的相关信息 8、环绕通知 9、切面的优先级 二、基于XML的AOP 1、准备工作 2、实现
66 2
|
3月前
|
设计模式 SQL 缓存
spring之面向切面:AOP(1)
【1月更文挑战第15天】 一、场景模拟 1、声明接口 2、创建实现类 3、创建带日志功能的实现类 4、提出问题 二、代理模式 1、概念 2、静态代理 3、动态代理 4、测试 三、AOP概念及相关术语 1、概述 2、相关术语 ①横切关注点 ②通知(增强) ③切面 ④目标 ⑤代理 ⑥连接点 ⑦切入点 3、作用
91 2
|
8月前
|
XML Java Maven
Spring AOP 面向切面编程(上)
Spring AOP 面向切面编程(上)
|
4月前
|
存储 Java 数据库
spring核心技术(下)--面向切面aop的特点加案例论证
spring核心技术(下)--面向切面aop的特点加案例论证