ascetik/objectstorage

自制的 SplObjectStorage 扩展

v0.3.0 2023-12-14 16:53 UTC

This package is auto-updated.

Last update: 2024-09-14 18:36:54 UTC


README

自制的 SplObjectStorage 扩展

此包的目的是更容易、更快速地使用 SplObjectStorage。该类的本地实现导致访问其内容的复杂性。

我尝试使用 php DS 包,但最终回到了增强此工具。

发行说明

版本 0.3.0

  • 偏移量读写访问

实现

Box

Box 使用 SplObjectStorage 来存储对象。它提供了在容器顶部或底部添加内容、检索或删除内容的简单方法。

可用方法

  • Box::associate(object, mixed, ?int): void - 添加或替换给定对象的偏移量
  • Box::clear(): void - 删除所有内容
  • Box::contains(object): bool - 检查实例是否存在(严格比较)
  • Box::count(): int - 返回项目数
  • Box::each(Closure): void - 对每个项目调用给定的闭包
  • Box::filter(Closure): self - 返回由闭包过滤后的新 Box
  • Box::find(Closure): ?object - 查找匹配闭包结果的元素
  • Box::first(): ?object - 返回第一个存储的元素
  • Box::getIterator(): SplObjectStorage - 返回 Box 迭代器
  • Box::hasAny(object): bool - 检查实例是否存在(值比较)
  • Box::isEmpty(): bool - 检查 Box 是否为空
  • Box::last(): ?object - 返回最后一个存储的元素
  • Box::map(Closure): self - 返回一个包含闭包返回实例的新 Box
  • Box::pop(): ?object - 移除并返回最后一个元素
  • Box::push(object, mixed): void - 在存储顶部添加内容
  • Box::readonly(): ReadonlyBox - 返回一个只读 Box
  • Box::remove(Closure): bool - 如果有过滤元素,则删除并返回 true,否则返回 false
  • Box::sort(callable, ?BoxSortOrder): void - 使用给定的算法对盒子进行排序,默认为升序
  • Box::sortReverse(callable): void - 使用给定的算法对盒子进行排序,降序
  • Box::shift(): ?object - 移除并返回第一个元素
  • Box::unshift(object, mixed): void - 在存储尾部添加内容
  • Box::valueOf(object): mixed - 如果存在,获取与给定对象关联的偏移量,否则为 null

ReadonlyBox

如名称所示,ReadonlyBox 是一个只读模式的 Box。它只提供读取方法。

可用方法

  • Box::contains(object): bool - 检查实例是否存在(严格比较)
  • Box::count(): int - 返回项目数
  • Box::find(Closure): ?object - 查找匹配闭包结果的元素
  • Box::each(Closure): void - 对每个项目调用给定的闭包
  • Box::first(): ?object - 返回第一个存储的元素
  • Box::getIterator(): SplObjectStorage - 返回 Box 迭代器
  • Box::hasAny(object): bool - 检查实例是否存在(值比较)
  • Box::isEmpty(): bool - 检查 Box 是否为空
  • Box::last(): ?object - 返回最后一个存储的元素
  • Box::map(Closure): self - 返回一个包含闭包返回实例的新 Box
  • Box::valueOf(object): mixed - 如果存在,获取与给定对象关联的偏移量,否则为 null

排序

Box 是可排序的,但需要算法来处理由 Box 注册的实例。

此算法接受两个参数:当前 Box 的值和下一个值。它返回一个整数,作为这两个值比较的结果,就像 usort() 中的实例一样。

偏移量访问

盒子实例提供了访问所有内容偏移量的方法。

方法 pushunshift 接受一个对象作为第一个参数,该对象要存储,以及一个可选的偏移量参数。然而,仍然可以通过使用 associate 方法在运行时添加或更改值的偏移量。

它接受 3 个参数

  • Box 可以为其注册的对象
  • 要添加/修改/删除的偏移量值
  • 一个可选的布尔值,默认设置为 false,强制将给定的对象及其关联的偏移量推入 Box
$box = new Box();
$class1 = new MyClass(1);
$class2 = new MyClass(2);
$class3 = new MyClass(3);
$box->push($class2, 'offset2'); // registering class2 with an offset as Box head
$box->unshift($class1, 'offset1'); // registering class2 with an offset as Box tail

$box->associate($class1, 'new offset'); // changing class1 offset

$box->associate($class2, null); // removing class2 offset

$box->associate($class3, 'offset3', $box::IGNORE_ON_MISSING); // $class3 not registered, no action (default behavior)

$box->associate($class3, 'offset3', $box::APPEND_ON_MISSING); // $class3 pushed in Box with its offset

$box->associate($class4, 'offset4', $box::PREPEND_ON_MISSING); // $class4 added as Box tail with its offset

ReadonlyBox 中不可使用 关联 方法。

要获取已注册对象的偏移量

// from last example
$offset1 = $box->valueOf($class1); // 'new offset' 

$offset2 = $box->valueOf($class2); // null 

$offset3 = $box->valueOf(new MyClass(4)); // null, unregistered object