登录
首页 >  文章 >  php教程

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

时间:2025-01-15 08:00:42 211浏览 收藏

哈喽!今天心血来潮给大家带来了《使用 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 的核心机制

本文的核心是 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 兼容的依赖注入容器》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>