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

2023-11-24

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

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

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

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

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

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

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

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


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

  1. 当前版本的 AOP 引擎旨在与 Composer 紧密合作,因此它使用自己的代理包装 Composer 加载器。从那时起,AOP 就知道应该加载哪个类以及在哪里查找其源代码。
  2. 有的课时Foo正在从文件加载Foo.php,AOP将其包装成特殊的过滤器流,如下所示:include 'php://filter/read=go.source.transforming.loader/resource=Foo.php';。您可以在以下位置阅读有关此流过滤器的更多信息“php://stream”手册
  3. 此时,类还没有加载到 PHP 内存中,但框架已经知道它的内容,并且可以执行分析甚至修改源代码。
  4. 然后将源代码标记化,通过以下方式解析为 ASTnikic/PHP 解析器库,然后通过以下方式生成此代码的静态反射(仍然没有将此文件加载到 PHP 内存中)goaop/解析器反射
  5. 引擎从方面检查所有已注册的切入点并执行原始类的转换Foo: 已更名为Foo__AopProxied和带有类的新文件Foo extends Foo__AopProxied是在缓存中生成的。
  6. 然后引擎指示自动加载器从新文件而不是原始文件加载此类,这样您就有了原始的类名,但带有来自建议的附加逻辑。它看起来像运行时自动生成装饰器。

当然,这只是少量信息,因为在纯 PHP 中实现 AOP 是一项非常艰巨的任务,在发现可行的解决方案之前我尝试了很多次,因此深入研究源代码以发现隐藏的宝石可能会很有趣:)一些信息也可以在我的PhpSerbia 谈论 PHP 中的横切问题,你可以观看它以更好地理解(抱歉我的英语)。

另外,我们现在正在编写框架文档,因此如果您想让它变得更好,只需向我们发送 PR 即可官方文档.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

普通 PHP 中的 AOP 不需要任何 PECL 扩展(开始!) - 如何? 的相关文章

随机推荐