objective-php / matcher
通用引擎,用于匹配标识符与简单而强大的模式
v1.1.1
2019-05-31 15:18 UTC
Requires
- php: >=7.1
Requires (Dev)
- codeception/codeception: ^3.0
README
库主题
Matcher 是一个简单但强大的键匹配引擎,旨在用于基于键识别的组件(事件处理程序、依赖注入器等)。
其背后的理念是提供一个灵活且高效的匹配单个键以及集合中子集的方式。第一个用例是我们的 EventHandler 组件。我们认为使用 Matcher 将回调附加到事件上,将比其他任何事件处理组件提供更统一和灵活的机制。
概念
部分
Matcher 可以处理的主标识符应由连接 部分
构成,这与命名空间的工作方式类似。
$id1 = 'key'; // root level key $id2 = 'section.key'; // namespaced section $id3 = 'section.sub-section.key'; // multi-level namespaced key $id4 = 'section.other-sub-section.key'; // other multi-level namespaced key
默认情况下,部分由点分隔。然而,这可以在组件中进行配置。键应使用小写,但这不是强制性的。这只是保持键统一的一种良好实践。
Matcher 了解部分概念,并在处理通配符时将依赖于此(见下一章)。
通配符
当比较一个标识符与另一个标识符时,任一标识符可以包含一个或多个通配符以表示部分:问号(?)将替换一个部分或键,而星号(*)将替换任意数量的部分和/或键。
替代
在某些情况下,通配符过于灵活……要限制匹配模式,您还可以通过为标识符的单个部分提供多个值来使用替代,使用方括号([ 和 ])。
使用
现在您已经了解了部分和通配符的概念,让我们看看一些示例,使用来自 MVC 工作流程示例的实际事件标识符。
$matcher = new Matcher(); $matcher->match('engine.extensions.load', 'engine.extensions.load'); // returns TRUE, of course $matcher->match('engine.extensions.load', 'engine.?.load'); // also returns TRUE $matcher->match('engine.resource.load', 'engine.?.load'); // returns TRUE as well $matcher->match('engine.extensions.load', '?.load'); // returns FALSE, since the question mark only replaces one section! $matcher->match('engine.extensions.load', '*.load'); // returns TRUE, since the star replaces any number of sections sections!
在上面的示例中,您可以看到 Matcher 如何帮助轻松地将回调绑定到多个事件。如果您需要更具体的选择,这正是替代可以帮到您的地方。
$matcher->match('engine.extensions.load', 'engine.[extensions|resource].load'); // also returns TRUE $matcher->match('engine.resource.load', 'engine.[extensions|resource].load'); // returns TRUE as well $matcher->match('engine.service.load', 'engine.[extensions|resource].load'); // this one returns FALSE
要查看更多示例,请查看单元测试!
性能
匹配算法已被重写多次,以达到相当不错的性能。在处理成千上万的循环调用大标识符堆栈(包括数千个条目,包括通配符)时,总用户时间消耗超过 100ms……鉴于现实应用中不太可能使用如此多的标识符(至少,对于事件或服务之类的实例),我们认为匹配引擎在性能方面非常透明。