9

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

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

更重要的是可以与任何现有的 PHP 框架和库集成(有或没有额外的配置)。

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

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

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

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

我很想知道这是如何工作的?它是如何实施的?

4

1 回答 1

15

这个框架使用了许多隐藏的技巧来完成它的工作,但是如果我们从鸟瞰的角度来看,那么过程可以描述如下:

  1. 当前版本的 AOP 引擎被设计为与 composer 紧密工作,因此它用自己的代理包装了 composer loader。从那时起,AOP 就知道应该加载哪个类以及在哪里寻找它的源代码。
  2. 当某个类Foo从 file 加载时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 的开发人员提供了许多功能。

于 2017-12-09T20:38:52.937 回答