飞行/处理程序列表

任意处理程序的通用列表实现

v3.0.0 2021-02-26 20:34 UTC

This package is auto-updated.

Last update: 2024-08-27 20:11:22 UTC


README

Build Status Scrutinizer Code Quality Code Coverage

这个非常简单的库提供了任意处理程序的通用列表实现。

其主要目标是简化将多个相关对象组织成处理程序可迭代列表的过程

  1. 通过提供类约束确保类型正确性,处理程序需要实现/扩展
  2. 支持定义处理程序的优先级

要求

不需要任何依赖项,只需 PHP 7.4 或 8.x。

示例

interface MyHandler {
    public function doSomething(): void;
}

class Foo implements MyHandler {

}

class Bar implements MyHandler {

}

class Baz extends Bar {

}

// Creating list of handlers
$handlers = new HandlersList([
    new Foo(), 
    new Bar(),
    new Baz(),
], MyHandler::class);

// ... later in code ...
foreach($handlers as $handler) {
    // We can be sure that $handler is of type MyHandler::class
    $handler->doSomething(); 
}

如果某个处理程序实现了 PrioritizedHandlerInterface - 其优先级将被考虑

interface MyHandler {
    public function name(): string;
}

class A implements MyHandler {
    public function name(): string {
        return 'A';
    }
}

class B implements MyHandler, PrioritizedHandlerInterface {
    public function name(): string {
        return 'B';
    }

    public function getHandlerPriority(): int {
        return 10;
    }
}
 
$handlers = new HandlersList([
    new A(), 
    new B(),
], MyHandler::class);

foreach($handlers as $handler) {
    echo $handler->name() . ' '; 
}

上面的示例将输出 B A,因为 B 的优先级高于 A,尽管它在处理程序列表中的位置更靠后。

方法

当然,可以修改处理程序列表

  • set() - 设置新的处理程序列表
  • add() - 向列表中添加新的处理程序
  • remove() - 从列表中移除指定的处理程序
  • clear() - 从列表中移除所有处理程序

还有几个用于检查处理程序列表的方法

  • isEmpty() - 检查处理程序列表是否为空
  • count() - 获取列表中处理程序的数量
  • accepts() - 检查列表是否接受给定的对象或给定类别的对象
  • contains() - 检查列表中是否存在指定的处理程序
  • filter() - 使用提供的测试可调用函数过滤处理程序列表,并返回匹配的处理程序数组
  • find() - 使用提供的可调用函数搜索处理程序
  • getIterator() - 获取列表中的处理程序作为迭代器
  • toArray() - 获取列表中的处理程序作为数组

还有其他方法

  • getConstraint() - 获取应用于此列表中处理程序的类约束

不可变处理程序列表

除了默认的可变处理程序列表实现之外,还有一个不可变版本:ImmutableHandlersList。其功能与默认版本完全相同,只是在列表修改方法上有所不同,它会返回列表的新副本而不是修改原始列表。

许可证

MIT 许可证