惰性对象的魅力
惰性对象,顾名思义,是在真正需要时才进行实例化的对象。这种特性在 PHP 8.4 中被引入,为依赖注入注入了新的活力。想象一下,当我们在一个大型应用中频繁地创建和销毁对象时,资源消耗无疑是一个巨大的负担。惰性对象的出现,正是为了缓解这一问题。
惰性对象的应用场景
让我们通过一个简单的示例来感受惰性对象的魅力。假设我们有一个 MyClass 类,它的构造函数需要进行一些耗时的初始化工作。如果我们直接实例化这个类,那么每次访问它时都会触发构造函数的执行,这显然是不必要的。
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 为惰性对象
在这个示例中,$object 是一个惰性对象,它只有在实际需要时才会被实例化。这样,我们就避免了不必要的资源消耗。
ContainerLazyObject 的核心机制
接下来,让我们来深入了解 ContainerLazyObject 类。这个类是惰性对象的核心,它允许我们注册依赖项并延迟其初始化。
class ContainerLazyObject { 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); } public function get(string $id): ?object { return $this->instances[$id] ?? null; } }
ContainerLazyObject 类的 set 方法允许我们注册依赖项,并指定其初始化方式。无论是闭包函数、类名还是已实例化的对象,都可以轻松注册。
服务注册与获取
使用 ContainerLazyObject,我们可以轻松地注册和获取服务。
$container = new ContainerLazyObject(); $container->set(DatabaseService::class, fn() => new DatabaseService(new LoggerService())); $container->set(LoggerService::class, fn() => new LoggerService());
在这个示例中,我们注册了 DatabaseService 和 LoggerService 两个服务,并指定了它们的初始化方式。
PSR-11 兼容性
ContainerLazyObject 遵循 PSR-11 规范,确保与其他 PSR-11 兼容的库和框架的互操作性。
性能对比
为了验证 ContainerLazyObject 的性能优势,我们使用 phpbench 对其进行了性能测试。结果显示,在简单的依赖解析场景中,ContainerLazyObject 的性能明显优于 Pimple、Illuminate 和 PHP-DI。
结论
PHP 8.4 的惰性对象特性为构建高效的依赖注入容器提供了新的途径。ContainerLazyObject 凭借其轻量级、高性能和 PSR-11 兼容性,成为了一种理想的依赖注入解决方案。建议您尝试在项目中使用,体验其带来的性能提升和代码简洁性。
以上就是使用 PHP 惰性对象构建 PSR 兼容的依赖注入容器的详细内容,更多请关注 php中文网其它相关文章!
免责声明:本站收集收录广告联盟资料仅为提供更多展示信息,本站无能力及责任对任何联盟进行真假以及是否骗子进行评估,所以交由用户进行点评。评论内容只代表网友观点,与广告联盟评测网立场无关!请网友注意辨别评论内容。因广告联盟行业鱼龙混杂,请各位站长朋友擦亮双眼,谨防受骗。
广告联系:QQ:1564952 注明:广告联盟评测网广告
Powered by:thinkphp8 蜀ICP备18021953号-4