quietfrog / dependency-graph
PHP 的依赖关系图
0.5.0
2014-08-24 13:29 UTC
Requires
- php: >=5.4.0
Requires (Dev)
- phpunit/phpunit: 4.1.*
- satooshi/php-coveralls: dev-master
README
这个库是从 https://github.com/MikeRoetgers/dependency-graph 分支出来的,以下是一些改动
- 将
DependencyManager
类重命名为Graph
- 将基本命名空间重命名为
QuietFrog
- 隐藏了一些类(例如
Operation
),以便使库更通用。 - 移除了标签处理
文档
这是一个简单的依赖关系图(有向无环图)的实现。定义服务及其之间的依赖关系。该图跟踪所有依赖关系,并给出服务可以执行的正确顺序。这对于处理长时间运行的任务特别方便,如果想要识别哪些服务可以并行执行。
示例
$service1 = new YourService1(); $service2 = new YourService2(); $service3 = new YourService3(); $service4 = new YourService4(); $graph = new Graph(); $graph->add($service1)->add($service2)->add($service3)->add($service4); $graph->addDependency($service1, $service2); $graph->addDependency($service1, $service3); $graph->addDependency($service2, $service4); $graph->addDependency($service3, $service4);
这个定义产生了以下图
1
/ \
2 3
\ /
4
询问图可以解决哪些依赖关系。当服务执行后,将其标记为已解决,并询问新的可用服务。
$services = $graph->getUnresolvedDependencies(); // $service1 $service1->doSomething(); $graph->markAsResolved($service1); $services = $graph->getUnresolvedDependencies(); // $service2 and $service3 $service3->doSomething(); $graph->markAsResolved($service3); $services = $graph->getUnresolvedDependencies(); // $service2 $service2->doSomething(); $graph->markAsResolved($service2); $services = $graph->getUnresolvedDependencies(); // $service4 $service4->doSomething();
更复杂的图也是可能的。
1 2
| / \
3 4 5
\ / |
6 7
|
8
无环性
图是无环的,这意味着类似以下情况是不允许的
$service1 = new YourService2(); $service2 = new YourService2(); $service3 = new YourService3(); $graph = new Graph(); $graph->add($service1)->add($service2)->add($service3); $graph->addDependency($service1, $service2); $graph->addDependency($service2, $service3); $graph->addDependency($service3, $service1);
1
/ \
2 – 3
初始化图时将检测到循环。将抛出 CircularDependencyDetectedException 异常。