使用 PHP 惰性对象构建 PSR 兼容的依赖注入容器

PHP 8.4 惰性对象:构建高性能 PSR-11 兼容依赖注入容器

使用 php 惰性对象构建 psr 兼容的依赖注入容器

PHP 8.4 引入的惰性对象特性为依赖注入带来了显著的性能提升。本文将探讨如何利用这一特性构建一个高性能的、PSR-11 兼容的依赖注入容器。惰性对象延迟初始化,仅在实际需要时才实例化对象,从而减少资源消耗。

惰性对象的应用

以下示例演示了惰性对象的用法,摘自 RFC:

class MyClass{    public function __construct(private int $foo)    {        // 耗时初始化逻辑    }    // ...}$initializer = static function (MyClass $ghost): void {    $ghost->__construct(123);};$reflector = new ReflectionClass(MyClass::class);$object = $reflector->newLazyGhost($initializer);// 此处 $object 为惰性对象

ContainerLazyObject 的核心机制

立即学习“PHP免费学习笔记(深入)”;

本文的核心是 ContainerLazyObject 类,它允许注册依赖项并延迟其初始化。其 set() 方法如下:

public function set(string $id, object|string $concrete): void{    $reflector = new ReflectionClass($id);    $initializer = $concrete;    if (is_string($concrete)) {        $initializer = function(object $instance) use ($concrete): void {            $this->instances[$instance::class] = $concrete($this);        };    }    if (is_object($concrete) && !$concrete instanceof Closure) {        $initializer = function(object $instance) use ($concrete): void {            $this->instances[$instance::class] = $concrete;        };    }    $this->instances[$id] = $reflector->newLazyGhost($initializer);}

该方法支持多种注册方式:闭包函数、类名或已实例化的对象。

服务注册与获取

ContainerLazyObject 支持多种服务注册方式:

$container = new ContainerLazyObject();$container->set(DatabaseService::class, fn() => new DatabaseService(new LoggerService()));$container->set(LoggerService::class, fn() => new LoggerService());// 使用类名注册$container->set(DatabaseService::class, DatabaseService::class);$container->set(LoggerService::class, LoggerService::class);// 使用已实例化的对象注册$container->set(DatabaseService::class, new DatabaseService(new LoggerService()));$container->set(LoggerService::class, new LoggerService());

服务获取方式如下:

$logger = $container->get(LoggerService::class);$database = $container->get(DatabaseService::class);

PSR-11 兼容性

ContainerLazyObject 遵循 PSR-11 规范,确保与其他 PSR-11 兼容的库和框架的互操作性。

性能对比

使用 phpbench 对 ContainerLazyObject 与 Pimple、Illuminate 和 PHP-DI 进行性能对比,结果显示 ContainerLazyObject 在简单的依赖解析场景中具有显著的性能优势:

ContainerLazyObject          ~0.100μs (±33.33%)Pimple                      ~0.297μs (±18.84%)Illuminate                  ~0.503μs (±9.07%)PHP-DI                      ~0.161μs (±41.57%)

完整代码

(此处省略完整代码,因篇幅过长,可参考原文)

结论

PHP 8.4 的惰性对象特性为构建高效的依赖注入容器提供了新的途径。ContainerLazyObject 凭借其轻量级、高性能和 PSR-11 兼容性,成为了一种理想的依赖注入解决方案。 建议您尝试在项目中使用,体验其带来的性能提升和代码简洁性。

以上就是使用 PHP 惰性对象构建 PSR 兼容的依赖注入容器的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1252331.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月9日 23:55:47
下一篇 2025年12月8日 11:45:39

相关推荐

  • 如何使用 Laravel Livewire 3 重定向 URL 或路由

    使用Laravel Livewire 3重定向URL或路由 本文将演示如何利用laravel livewire 3实现url或路由重定向。我们将创建一个photoupload livewire组件作为示例,该组件包含一个带文件上传功能的表单,并包含图片验证。用户选择图片后,利用withfileupl…

    2025年12月9日
    000
  • Laravel 路线替代方案

    最近关于Laravel Folio的讨论引发了我对Laravel路由设置方法的思考,总结如下: Laravel内置路由机制 Laravel默认使用路由目录下的文件定义路由。每个HTTP动词都有对应的Route类方法(GET, POST, PUT, DELETE等),也可使用Route::any()方…

    2025年12月9日
    000
  • 如何安装和设置 Laravel Livewire 3

    本教程将指导您如何轻松安装和配置 Laravel Livewire 3。我们将从 Livewire 的优势入手,逐步演示安装过程。 Laravel Livewire 是一个强大的全栈框架,允许您使用 PHP 构建动态、交互式的 Web 应用程序,无需编写大量的 JavaScript 代码。它简化了构…

    2025年12月9日
    000
  • 为什么我构建了在其他地方找不到的 Laravel 编码包

    Laravel项目中的编码难题及解决方案 在开发Laravel项目时,我遇到了一个棘手的字符串编码解码问题。Laravel内置的加密解密函数虽然可用,但生成的字符串过长,不适用于URL或共享场景。Base64编码虽然更简洁,但要使其URL安全则需要额外处理,不够便捷。 市场上也缺乏一个简单易用、可定…

    2025年12月9日
    000
  • 在Linux上如何搭建PHP 8环境?

    搭建PHP 8环境需要先具备Linux系统基础,熟练命令行操作。安装PHP 8时因发行版而异,以Debian/Ubuntu为例:安装PHP 8本身:sudo apt install php8.1 php8.1-cli php8.1-fpm php8.1-mysql php8.1-curl php8.…

    2025年12月9日
    000
  • 如何配置PHP 8的错误报告?

    PHP 8 错误报告配置涉及错误级别的设置、日志记录以及不同的环境配置。首先,使用 error_reporting 设置要报告的错误级别,如 E_ALL 报告所有错误。然后,使用 display_errors 控制是否在浏览器中显示错误信息,在开发环境中建议设置为 On,在生产环境中建议设置为 Of…

    2025年12月9日
    000
  • 如何选择合适的PHP 8开发工具?

    PHP 8開發工具選擇取決於項目規模和個人偏好。主流選項包括:程式碼編輯器/IDE:VS Code:免費、輕量級、可擴展,適合各種平台。PHPStorm:強大的功能集,但收費且資源需求高。Sublime Text:輕量級、自訂性高,可用於簡單的PHP開發。除錯工具:Xdebug:配合VS Code或…

    2025年12月9日
    000
  • 我终于找到了 MAMP 的完美替代品

    macos web 开发者常用的 mamp,虽然易于设置开发环境,但免费版功能有限,尤其在多项目管理方面存在不足。mamp 不支持多站点设置,开发者需要手动配置,费时费力,学习曲线陡峭。 MAMP 多项目支持的局限性 开发多个项目时,轻松管理不同网站至关重要。MAMP 的设置过程复杂,每次管理多个网…

    2025年12月9日
    000
  • PHP OOP 部分静态属性、方法以及 this 与 self

    本教程系列将深入讲解PHP面向对象编程(OOP)的基础知识。内容将分章节呈现,循序渐进地讲解各个主题。无论您是OOP新手还是想巩固基础知识,本系列都将为您提供清晰的学习路径。本节将重点探讨PHP中的静态属性、静态方法以及this和self关键字的用法。让我们开启PHP OOP之旅! 属性和方法:基本…

    2025年12月9日
    000
  • 如何使用 Traefik 在子文件夹中设置 Laravel

    本文介绍如何在 Traefik 反向代理下,将 Laravel 应用部署到子文件夹中。 假设:Traefik 已安装并配置了 HTTP 和 HTTPS 入口点,Laravel 应用部署在 /app 子文件夹,Traefik 和 Laravel 使用名为 traefik 的外部网络。 修改 docke…

    2025年12月9日
    000
  • 此 Cron 作业代码如何为您提供帮助?

    我已经使用 postype tvshows、seasons、episodes 为我的网站创建了此 cron 作业,它正确获取季节,然后生成它并发布,但是当其现有季节剧集的时间调用时,它不会生成和发布?有哪位好朋友能帮我解决这个问题吗? `// 第 1 步:注册自定义一分钟间隔进行测试add_filt…

    好文分享 2025年12月9日
    000
  • 如何安装Nginx服务器并配置PHP 8?

    Nginx与PHP 8集成指南安装Nginx:使用apt软件包管理器(Ubuntu示例)。安装PHP 8:使用ppa源和apt软件包管理器(Ubuntu示例)。配置Nginx:添加location块处理PHP文件(根据系统路径修改socket)。测试配置文件并重启Nginx。定位问题:检查Nginx…

    2025年12月9日
    000
  • 如何配置PHP 8的时区?

    PHP 8的时区配置主要依靠php.ini和源码。在源码中,使用date_default_timezone_set()函数设置时区,需指定准确的时区标识符。若使用DateTimeZone类,则可更精细地控制时区。常见错误包括忘记设置时区或使用错误的标识符,可通过date_default_timezo…

    2025年12月9日
    000
  • PHP7和PHP8的未来发展方向

    PHP7和PHP8的未来在于持续性能优化、更强大的类型系统、拥抱现代开发模式、扩展生态系统和社区建设。PHP7带来了性能飞跃,PHP8引入了命名参数、联合类型等现代特性。未来,PHP将专注于JIT编译器优化、加强类型检查、适应微服务架构、丰富生态系统扩展和加强社区建设。 PHP7和PHP8的未来:一…

    2025年12月9日
    000
  • 如何在 Ubuntu 上安装 PHP

    PHP 代表超文本预处理器,它是一种基于脚本的服务器端编程语言。PHP 有助于自动化各种服务器任务。它处理动态内容、数据库请求和数据预处理/显示等任务。 安装 PHP Ubuntu 像许多开发工具一样,PHP 有几个不同的版本 版本。在撰写本文时,PHP 7.4。和 8.1 是当前 支持和最常用的软…

    2025年12月9日 好文分享
    000
  • 配置 Laravel 日:环境设置

    Laravel 环境配置是确保应用在开发、测试和生产环境中稳定高效运行的关键。Laravel 的环境配置系统简化了这一过程。本文将指导您有效设置和管理 Laravel 环境。 1. .env 文件 Laravel 环境配置的核心是项目根目录下的 .env 文件。该文件包含定义应用设置的键值对。 .e…

    2025年12月9日
    000
  • PHP7和PHP8的数组操作差异

    PHP8的数组操作引入性能优化、更简洁灵活的语法和新增特性,包括:遍历数组时内存访问次数减少,性能提升,尤其在处理大型数组时。str_contains()函数优雅地检查字符串是否包含子串,处理数组元素更方便。命名参数提高代码可读性,尤其当函数参数较多时。match表达式更灵活地处理数组元素,减少代码…

    2025年12月9日
    000
  • PHP7和PHP8的代码示例对比

    升级 PHP 8 非常值得,因为它带来性能提升、代码优雅性和新特性。PHP 8 的联合类型、命名参数、属性和 Match 表达式等增强了代码表达性和可读性,同时保持高性能。然而,升级前需注意弃用特性和扩展库兼容性,并进行充分测试,以平稳过渡至 PHP 8。 PHP 7 和 PHP 8:代码风格的进化…

    2025年12月9日
    000
  • Sublime Text Config for Laravel

    本文档介绍了笔者使用 Sublime Text 编辑器进行 Laravel 应用开发时的配置方案。 插件 以下插件显著提升了开发效率: GitBlameGitGutterAdvancedNewFileSyncSideBarLSPLSP-intelephenseLSP-bashLSP-dockerfi…

    2025年12月9日
    000
  • 如何选择合适的Web服务器?

    选择Web服务器时,关键在于应用场景,根据流量、并发量等需求选择合适软件。基础服务器软件包括Apache、Nginx、IIS,各有特点。Nginx轻量级,适合静态资源和反向代理,Apache配置灵活。高并发、高流量网站可考虑负载均衡技术或性能更强大的服务器软件,如Apache。性能调优、安全配置也不…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信