普通PHP中的AOP,不需要任何PECL扩展(Go!) - 如何?

Kry*_*ska 7 php oop aop frameworks goaop

有一个名为Go的框架!面向方面的PHP框架

它是用纯PHP制作的,不需要任何PECL扩展和DI容器就可以工作.

还可以与任何现有的PHP框架和库集成(使用或不使用其他配置).

并且没有切入点的运行时检查,没有运行时注释解析,没有eval和__call方法,没有慢代理和call_user_func_array().快速引导过程(2-20ms)和建议调用.

所以我印象非常深刻,但我想知道的是,这实际上是如何运作的?

我在这里列出的这些要点......

我查看了github和官方网站以及其他一些文章,但是找不到任何关于这是如何工作的具体信息(一般情况下和具体情况).

我非常渴望知道这是如何工作的?它是如何实现的?

lis*_*nko 11

这个框架使用许多隐藏的技巧来执行它的工作,但是如果我们从鸟的视图看,那么过程可以描述如下:

  1. 当前版本的AOP引擎旨在与作曲家紧密配合,因此它将作曲家加载器与自己的代理包装在一起.从那时起,AOP知道应该加载哪个类以及在哪里查找其源代码.
  2. 当某个类Foo从文件加载时Foo.php,AOP将其包装到特殊的过滤器流中,如下所示:include 'php://filter/read=go.source.transforming.loader/resource=Foo.php';.您可以在"php:// stream"手册中阅读有关此流过滤器的更多信息
  3. 在那个时间点,类没有加载到PHP内存中,但是框架已经知道它的内容并且可以执行分析甚至修改源代码.
  4. 然后将源代码标记化,通过nikic/PHP-Parser库解析为AST ,然后通过goaop/parser-reflection生成此代码的静态反射(仍然无需将此文件加载到PHP的内存中)
  5. 引擎从方面检查所有已注册的切入点并执行原始类的转换Foo:它被重命名为,Foo__AopProxied并且Foo extends Foo__AopProxied在缓存中生成具有类的新文件.
  6. 引擎然后直接自动加载器从该新文件而不是原始文件加载此类,因此您具有原始类名,但具有来自建议的其他逻辑.它看起来像在运行时生成自动装饰器.

当然,它只是少量的信息,因为在纯PHP中实现AOP是非常艰巨的任务,我在发现工作解决方案之前尝试了很多次,所以挖掘源代码来发现隐藏的宝石会很有趣:)一些信息也可以在我的PhpSerbia谈论PHP中的跨领域问题,你可以观看它以便更好地理解(对不起我的英语).

我们现在正在研究框架文档,所以如果你想让它变得更好,只需将PR发送给官方文档即可.

您还应该使用PhpStorm插件,它为在PHP项目中使用AOP的开发人员提供了许多功能.