ocramius/lazy-map

此包已被弃用,不再维护。未建议替代包。

一个提供对象映射懒加载逻辑的库

资助包维护!
Ocramius


README

这个小型库旨在提供一个非常简单且高效的懒加载对象映射。

Total Downloads Latest Stable Version Latest Unstable Version Mutation testing badge

弃用

从 PHP 8.3 开始,动态属性不再被“开箱即用”允许。虽然仍然可以通过显式声明(#[\AllowDynamicProperties] 属性)拥有动态属性,但此包的长期考虑不再认为是安全且高效的。

基于此,此包已弃用并停止维护:请使用传统的 PHP array

安装

建议的安装方法是通过 composer

composer require ocramius/lazy-map

使用

当前的实现非常简单,允许通过 LazyMap\CallbackLazyMap 定义“服务”映射。

$map = new \LazyMap\CallbackLazyMap(function ($name) {
    $object = new \stdClass();

    $object->name = $name;

    return $object;
});

var_dump($map->foo);
var_dump($map->bar);
var_dump($map->{'something special'});

目的

该库背后的想法是避免像以下这样的低效懒加载操作

private function getSomething($name)
{
    if (isset($this->initialized[$name]) || array_key_exists($name, $this->initialized)) {
        return $this->initialized[$name];
    }

    return $this->initialized[$name] = new Something($name);
}

这在你需要调用 getSomething() 千次时,可以大大减少开销。这在映射大量不同服务并反复迭代它们时特别有用。

性能

LazyMap 实际上比上面展示的“低效”示例表现要好得多。您可以直接查看性能测试套件以获取有关测试实现的具体信息,但以下是一些供您参考的结果

已初始化映射性能

方法名称 操作/秒 相对
initializedArrayPerformance 2,277,272.90002 100.00%
initializedArrayMapPerformance 1,536,988.76108 148.16%
initializedLazyMapPerformance 4,446,227.23514 51.22%

未初始化映射性能

方法名称 操作/秒 相对
unInitializedArrayPerformance 1,091,720.80627 100.00%
unInitializedArrayMapPerformance 688,132.30083 158.65%
unInitializedLazyMapPerformance 912,191.90744 119.68%