由于项目有一个需求,需要在原来的代码上做一个封装.?由于不想修改原有代码,?查了一下,?PHP没有方便的支持AOP的方法,于是参考了网上一些文章,写了个包装器,?可以在不修改原有代码的基础上为函数添加before和after实现.
?
标签:
?
代码片段(3)[全屏查看所有代码]
1.?[代码]核心类?????
01 |
<?php |
02 |
? |
03 |
/** |
04 |
? * 包装器(Wrapper).
|
05 |
? * Wrapper是一个AOP_LIKE的实现. 也可以看作监听者模式的实现.
|
06 |
? * 一个Wrapper报装了一个对象(source). source可以是任意对象(不包括数组及原子类型),甚至是一个Wrapper.
|
07 |
? *
|
08 |
? * 包装器可以任意添加饰品(Decoration).通过Wrapper调用source的函数的流程将是:
|
09 |
? *? unpacking --> teardown --> open --> setup --> packing.
|
10 |
? *
|
11 |
? *? 例如调用source->doXX(),各个流程将是:
|
12 |
? *? unpacking:? 解包. 这是调用任意source的函数都会调用的方法;
|
13 |
? *? teardown:?? 撕掉饰品. 对于Wrapper中的每个Decoration,调用其before()函数;
|
14 |
? *? open:?????? 真正调用source->doXX()函数;
|
15 |
? *? setup:????? 重新贴上饰品. 对于Wrapper中的每个Decoration,调用其after()函数;
|
16 |
? *? packing:??? 重新打包.? 这是调用任意source的函数都会调用的方法;
|
17 |
? *
|
18 |
? */
|
19 |
class ?Wrapper{
|
20 |
???? private ?$source ;
|
21 |