Go! php aop 初体验

源码好高深莫测。这好像是第三次搞,终于能看到预想的效果了。

$ex = new Example();
$ex->doSth(.2);

输出

Calling Before Interceptor for method: Example->doSth() with arguments: [0.2]

关键一点,官方的文档上有提到,就是待切割的类不能直接require,而是要把require它们的autoloader的文件路径传到Go!中。

通过反射机制,初步判断,待切割的类Example实际上并没有被require,它是通过Dissect的Lexer和Parser两个包读取然后加载到脚本中的,并且它被重命名为了Example__AopProxied,而实际上加载进入脚本中的新Example类是继承了这个Example__AopProxied类,并在原Example类基础上加入了一个private static属性$__joinPoints用以记录它代理的原类的方法等切面。

脚本一共加载了100+文件,使用内存peak值0.81M(win32 php5.4.12 ts built-in server with apc & zend optimizer+),而$ex->doSth(.2); 这个方法调用实际的堆栈只有6个,脚本有很大一部分是在做对原autoloader的修改,待切割类读取分析,切面分析,新类生成,想想如果有使用了缓存机制的话,那效率应该会提高很多。

看来我还要好好学习英语好好学习设计模式。。

你可能感兴趣的:(AOP,PHP,go!)