百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Go!PHP面向对象的现代AOP框架(php是面向对象还是面向过程)

ccwgpt 2024-09-14 00:13 60 浏览 0 评论

简介

AOP是一个现代的面向切面的框架,使用简单的PHP,具有丰富的功能,适用于新级别的软件开发。该框架允许在传统的面向对象的PHP代码中解决横切问题,为您的代码提供高效和透明的钩子系统。

特征

  • 为PHP提供动态钩子系统,无需更改原始源代码。
  • 不需要任何PECL扩展(php-aop,runkit,uopz)和DI容器即可工作。
  • 面向切面的方面、连接点和切入点设计。
  • 拦截类中任何公共或受保护方法的执行。
  • 拦截静态方法和final类中方法的执行。
  • 拦截traits中方法的执行。
  • 拦截对对象的公共/受保护属性的访问。
  • 用于静态类初始化的钩子(在类加载到PHP内存之后)。
  • 用于对象初始化的钩子(截取 new 关键字)。
  • 拦截系统PHP函数的调用。
  • 能够通过 Around 类型的通知更改任何方法/函数的返回值。
  • 于在源代码中定义切入点的丰富切入点语法。
  • 使用Xcad进行AOP的本机调试。具有编织方面的代码是完全可读的和原生的。您可以在原始类或方面中放置断点,它将工作(对于调试模式)!
  • 可以与任何现有的PHP框架和库集成(有或没有额外的配置)。
  • 高度优化的生产用途:支持操作码缓存,延迟加载建议和方面,连接点缓存,没有运行时检查切入点,没有运行时注释解析,没有evals和 __call 方法,没有慢速代理和 call_user_func_array() 。快速引导过程(2- 20毫秒)和通知调用。

什么是AOP?

AOP(面向对象编程)是一种处理横切关注点的方法,这些关注点是以“模块化”的方式设计和实现的(也就是说,有适当的封装,没有重复等),然后以简洁和健壮的方式集成到所有相关的执行点中,例如通过声明性或编程性手段。

在AOP术语中,执行点被称为连接点。这些点的集合称为切入点,在连接点之前、之后或“周围”执行的新行为称为通知。你可以在Introduction部分阅读更多关于AOP的内容。

安装

AOP框架可以与composer一起安装。安装非常简单

Step 1 使用composer下载库

请composer下载最新版本的Go!AOP框架及其依赖项,运行以下命令:

composer require goaop/framework

Composer会将框架安装到项目的 vendor/goaop/framework 目录中。

Step 2 创建应用程序切面内核

这个框架的目的是为您的应用程序提供简单的AOP集成。你必须首先为你的应用程序创建 AspectKernel 类。这个类将在一个地方管理应用程序的所有方面。

该框架提供了基类,使创建自己的内核变得更容易。要创建应用程序内核,请扩展抽象类 Go\Core\AspectKernel

<?php
// app/ApplicationAspectKernel.php

use Go\Core\AspectKernel;
use Go\Core\AspectContainer;

/**
 * Application Aspect Kernel
 */
class ApplicationAspectKernel extends AspectKernel
{

    /**
     * Configure an AspectContainer with advisors, aspects and pointcuts
     *
     * @param AspectContainer $container
     *
     * @return void
     */
    protected function configureAop(AspectContainer $container)
    {
    }
}

Step 3 在前端控制器中配置aspect内核

要配置方面内核,请调用内核实例的 init() 方法。

// front-controller, for Symfony2 application it's web/app_dev.php

include __DIR__ . '/vendor/autoload.php'; // use composer

// Initialize an application aspect container
$applicationAspectKernel = ApplicationAspectKernel::getInstance();
$applicationAspectKernel->init([
        'debug'        => true, // use 'false' for production mode
        'appDir'       => __DIR__ . '/..', // Application root directory
        'cacheDir'     => __DIR__ . '/path/to/cache/for/aop', // Cache directory
        // Include paths restricts the directories where aspects should be applied, or empty for all source files
        'includePaths' => [
            __DIR__ . '/../src/'
        ]
]);

Step 4 创建一个方面

方面是AOP哲学的关键元素。走!AOP框架只使用简单的PHP类来声明方面,这使得面向对象的所有特性都可以用于方面类。作为一个例子,让我们截取所有的方法并显示它们的名称:

// Aspect/MonitorAspect.php

namespace Aspect;

use Go\Aop\Aspect;
use Go\Aop\Intercept\FieldAccess;
use Go\Aop\Intercept\MethodInvocation;
use Go\Lang\Annotation\After;
use Go\Lang\Annotation\Before;
use Go\Lang\Annotation\Around;
use Go\Lang\Annotation\Pointcut;

/**
 * Monitor aspect
 */
class MonitorAspect implements Aspect
{

    /**
     * Method that will be called before real method
     *
     * @param MethodInvocation $invocation Invocation
     * @Before("execution(public Example->*(*))")
     */
    public function beforeMethodExecution(MethodInvocation $invocation)
    {
        echo 'Calling Before Interceptor for: ',
            $invocation,
            ' with arguments: ',
            json_encode($invocation->getArguments()),
            "<br>\n";
    }
}

很简单,不是吗?我们在这里声明,我们希望在执行Example类中的所有动态公共方法之前安装一个钩子。这是在注释#0的帮助下完成的#钩子可以是任何类型,你稍后会看到它们。但是我们不改变类Example中的任何代码!我能感受到你的惊讶。

Step 5 在方面内核中注册方面

要注册aspect,只需在内核的 configureAop() 方法中添加它的实例:

// app/ApplicationAspectKernel.php

use Aspect\MonitorAspect;

//...

    protected function configureAop(AspectContainer $container)
    {
        $container->registerAspect(new MonitorAspect());
    }

//...

Step 6 可选配置

默认情况下,Go!AOP使用 Doctrine\Common\Cache\FilesystemCache 来缓存注释。但是,如果您需要使用任何其他缓存引擎进行注释,您可以通过应用程序方面内核的 annotationCache 配置选项配置缓存驱动程序。唯一的要求是缓存驱动程序实现 Doctrine\Common\Cache\Cache 接口。

这在部署到只读文件系统时非常有用。在这种情况下,你可以使用,例如: Doctrine\Common\Cache\ArrayCache 或一些基于内存的缓存驱动程序。

相关推荐

一个基于.Net Core遵循Clean Architecture原则开源架构

今天给大家推荐一个遵循CleanArchitecture原则开源架构。项目简介这是基于Asp.netCore6开发的,遵循CleanArchitecture原则,可以高效、快速地构建基于Ra...

AI写代码翻车无数次,我发现只要提前做好这3步,bug立减80%

写十万行全是bug之后终于找到方法了开发"提示词管理助手"新版本那会儿,我差点被bug整崩溃。刚开始两周,全靠AI改代码架构,结果十万行程序漏洞百出。本来以为AI说没问题就稳了,结果...

OneCode低代码平台的事件驱动设计:架构解析与实践

引言:低代码平台的事件驱动范式在现代软件开发中,事件驱动架构(EDA)已成为构建灵活、松耦合系统的核心范式。OneCode低代码平台通过创新性的注解驱动设计,将事件驱动理念深度融入平台架构,实现了业务...

国内大厂AI插件评测:根据UI图生成Vue前端代码

在IDEA中安装大厂的AI插件,打开ruoyi增强项目:yudao-ui-admin-vue31.CodeBuddy插件登录腾讯的CodeBuddy后,大模型选择deepseek-v3,输入提示语:...

AI+低代码技术揭秘(二):核心架构

本文档介绍了为VTJ低代码平台提供支持的基本架构组件,包括Engine编排层、Provider服务系统、数据模型和代码生成管道。有关UI组件库和widget系统的信息,请参阅UI...

GitDiagram用AI把代码库变成可视化架构图

这是一个名为gitdiagram的开源工具,可将GitHub仓库实时转换为交互式架构图,帮助开发者快速理解代码结构。核心功能一键可视化:替换GitHubURL中的"hub...

30天自制操作系统:第六天:代码架构整理与中断处理

1.拆开bootpack.c文件。根据设计模式将对应的功能封装成独立的文件。2.初始化pic:pic(可编程中断控制器):在设计上,cpu单独只能处理一个中断。而pic是将8个中断信号集合成一个中断...

AI写代码越帮越忙?2025年研究揭露惊人真相

近年来,AI工具如雨后春笋般涌现,许多人开始幻想程序员的未来就是“对着AI说几句话”,就能轻松写出完美的代码。然而,2025年的一项最新研究却颠覆了这一期待,揭示了一个令人意外的结果。研究邀请了16位...

一键理解开源项目:两个自动生成GitHub代码架构图与说明书工具

一、GitDiagram可以一键生成github代码仓库的架构图如果想要可视化github开源项目:https://github.com/luler/reflex_ai_fast,也可以直接把域名替换...

5分钟掌握 c# 网络通讯架构及代码示例

以下是C#网络通讯架构的核心要点及代码示例,按协议类型分类整理:一、TCP协议(可靠连接)1.同步通信//服务器端usingSystem.Net.Sockets;usingTcpListene...

从复杂到优雅:用建造者和责任链重塑代码架构

引用设计模式是软件开发中的重要工具,它为解决常见问题提供了标准化的解决方案,提高了代码的可维护性和可扩展性,提升了开发效率,促进了团队协作,提高了软件质量,并帮助开发者更好地适应需求变化。通过学习和应...

低代码开发当道,我还需要学习LangChain这些框架吗?| IT杂谈

专注LLM深度应用,关注我不迷路前两天有位兄弟问了个问题:当然我很能理解这位朋友的担忧:期望效率最大化,时间用在刀刃上,“不要重新发明轮子”嘛。铺天盖地的AI信息轰炸与概念炒作,很容易让人浮躁与迷茫。...

框架设计并不是简单粗暴地写代码,而是要先弄清逻辑

3.框架设计3.框架设计本节我们要开发一个UI框架,底层以白鹭引擎为例。框架设计的第一步并不是直接撸代码,而是先想清楚设计思想,抽象。一个一个的UI窗口是独立的吗?不是的,...

大佬用 Avalonia 框架开发的 C# 代码 IDE

AvalonStudioAvalonStudio是一个开源的跨平台的开发编辑器(IDE),AvalonStudio的目标是成为一个功能齐全,并且可以让开发者快速使用的IDE,提高开发的生产力。A...

轻量级框架Lagent 仅需20行代码即可构建自己的智能代理

站长之家(ChinaZ.com)8月30日消息:Lagent是一个专注于基于LLM模型的代理开发的轻量级框架。它的设计旨在简化和提高这种模型下代理的开发效率。LLM模型是一种强大的工具,可以...

取消回复欢迎 发表评论: