ascetik / objectstorage
自制的 SplObjectStorage 扩展
v0.3.0
2023-12-14 16:53 UTC
Requires
- ascetik/callapsule: ^0.4.0
Requires (Dev)
- phpunit/phpunit: ^10.5
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() 中的实例一样。
偏移量访问
盒子实例提供了访问所有内容偏移量的方法。
方法 push 和 unshift 接受一个对象作为第一个参数,该对象要存储,以及一个可选的偏移量参数。然而,仍然可以通过使用 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