php - 不需要任何 PECL 扩展的纯 PHP 中的 AOP(开始!)- 怎么做?

标签 php oop frameworks aop goaop

有一个框架叫Go! Aspect-Oriented Framework for PHP

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

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

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

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

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

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

我非常想知道它是如何工作的?它是如何实现的?

最佳答案

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

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

当然,这只是少量信息,因为在纯 PHP 中实现 AOP 是一项非常艰巨的任务,在发现可行的解决方案之前我尝试了很多次,因此深入研究源代码以发现隐藏的 gem 可能会很有趣: ) 一些信息也可以在我的PhpSerbia talk about cross-cutting concerns in PHP 中找到。 ,你可以观看它以便更好地理解(对不起我的英语)。

此外,我们目前正在为框架编写文档,所以如果您想让它变得更好,只需向我们发送 PR 到 official documentation .

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

关于php - 不需要任何 PECL 扩展的纯 PHP 中的 AOP(开始!)- 怎么做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47653138/

相关文章:

Java设计问题使用哪个框架? JBoss、休息等

php - 如何通过 Slim php 和 Paris 将 Backbone 模型数据发布到数据库

php - 如何在没有 Zend FW 的情况下使用 Zend Dom Query?

java - 一个类怎么会有自己类型的成员,这不是无限递归吗?

PHP MySQL 对象优化

xcode - 在 xcode 中创建框架时保留目录结构

javascript - fabricjs 如何在其他缩放时保持组元素的固定大小?

php - Netbeans sftp 下载 "only new"

PHP:传递mysql查询变量而不将它们包含在 "or '中

python - 项目的多重继承与组合的讨论(+其他事情)