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

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
微信扫一扫
支付宝扫一扫