pear / fsm
有限状态机
Requires
- php: >=4.0.4
- pear/pear_exception: *
Requires (Dev)
Suggests
- pear/image_graphviz: Install optionally via your project's composer.json
This package is auto-updated.
Last update: 2024-09-20 02:32:26 UTC
README
用户文档
内容
1 关于 FSM 包
FSM 包 实现了一个 有限状态机。除了维护状态外,该 FSM 还管理用户定义的有效负载,因此有效地使机器成为一个 下推自动机(具有记忆的有限状态机)。
此代码主要基于 Noah Spurrier 的优秀 FSM Python 类。
2 构建有限状态机
构建有限状态机的第一步是列出有限的状态集合。然后,必须定义这些状态之间所有允许的转换。每个转换都与一个符号和一个可选的回调函数相关联。输入处理程序将尝试将当前符号与已注册的转换列表进行匹配。如果找到使用该符号从当前状态转换到新状态,则机器将移动到由转换指定的新状态,如果指定了,则将调用相关的回调函数。
2.1 创建新的 FSM 对象
首先在您的脚本中包含 FSM 包
require 'FSM.php';
在构建新的 FSM 对象时,您必须指定机器的初始状态并提供一个有效负载变量。有效负载将被传递到所有回调函数中,为它们提供状态信息,而不使用(滥用)全局变量。
在此示例中,我们传递一个表示堆栈的数组作为有效负载。机器的初始状态设置为 START
。
$stack = array(); $fsm = new FSM('START', $stack);
2.2 定义转换
我们需要定义一些转换,以便使我们的机器变得有用。让我们假设我们的机器有两个额外的状态: MIDDLE
和 END
。以下是我们将如何定义从 START
到 MIDDLE
和从 MIDDLE
到 END
的转换
function FirstCallback($symbol, &$payload, $currentState, $nextState) { echo "First Transition\n"; } function SecondCallback($symbol, &$payload, $currentState, $nextState) { echo "Second Transition\n"; } $fsm->addTransition('FIRST', 'START', 'MIDDLE', 'FirstCallback'); $fsm->addTransition('SECOND', 'MIDDLE', 'END', 'SecondCallback');
我们的机器现在知道三个状态(START
、MIDDLE
和 END
)和两个符号(FIRST
和 SECOND
)。已定义了两个转换(START
到 MIDDLE
和 MIDDLE
到 END
)并关联了回调。以下代码将处理符号 FIRST
和 SECOND
并将我们从初始状态(START
)移动到 MIDDLE
状态再到 END
状态。
$fsm->process('FIRST'); $fsm->process('SECOND');
处理程序将在路上调用我们的两个回调,结果如下打印
First Transition Second Transition
2.3 设置默认转换
现在我们将设置一个默认转换。此转换将在处理程序找不到当前状态和符号的更好匹配时使用。对于我们的示例,我们将其视为错误并向用户打印警告。
function ErrorCallback($symbol, &$payload, $currentState, $nextState) { echo "This symbol does not compute: $symbol\n"; } $fsm->setDefaultTransition('START', 'ErrorCallback');
现在让我们以意外的顺序处理我们的符号
$fsm->process('SECOND'); $fsm->process('FIRST');
由于 SECOND
转换没有指定 START
作为其初始状态,将使用默认转换并调用错误回调。然而,FIRST
转换将按预期工作,因为机器仍然处于 START
状态。
3 绘制状态机
FSM 包可选支持使用 Image_GraphViz 包绘制机器的状态。这样做很简单,只需使用现有的状态机实例创建一个新的 FSM_GraphViz
对象,然后导出图形。
require_once 'FSM/GraphViz.php'; $converter = new FSM_GraphViz($fsm); $graph = $converter->export();
生成的图形对象是一个 Image_GraphViz
实例。要导出图形为图像,请使用 image()
方法
$graph->image('png');
这将生成一个类似于以下图像
有关更多信息,请参阅 Image_GraphViz 文档。
4 开发和支持
4.1 报告问题和建议
如果您遇到问题或想提出建议,请使用 PEAR Bug Tracker。对于其他问题,您可以直接联系我,但请尽可能使用错误跟踪器,以便社区的其他人也能从您的反馈和我的回复中受益。
4.2 即将推出
本节包含一个“待办”项目列表,希望在未来的版本中得到解决。
- 目前没有项目。
如果您有功能建议,请使用 PEAR Bug Tracker 提交。