pear/fsm

有限状态机

dev-master 2021-03-19 18:49 UTC

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   定义转换

我们需要定义一些转换,以便使我们的机器变得有用。让我们假设我们的机器有两个额外的状态: MIDDLEEND。以下是我们将如何定义从 STARTMIDDLE 和从 MIDDLEEND 的转换

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');

我们的机器现在知道三个状态(STARTMIDDLEEND)和两个符号(FIRSTSECOND)。已定义了两个转换(STARTMIDDLEMIDDLEEND)并关联了回调。以下代码将处理符号 FIRSTSECOND 并将我们从初始状态(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');

这将生成一个类似于以下图像

Example State Machine Plot

有关更多信息,请参阅 Image_GraphViz 文档

4   开发和支持

4.1   报告问题和建议

如果您遇到问题或想提出建议,请使用 PEAR Bug Tracker。对于其他问题,您可以直接联系我,但请尽可能使用错误跟踪器,以便社区的其他人也能从您的反馈和我的回复中受益。

4.2   即将推出

本节包含一个“待办”项目列表,希望在未来的版本中得到解决。

  • 目前没有项目。

如果您有功能建议,请使用 PEAR Bug Tracker 提交。