PHP中有卫士的有限状态机?

时间:2011-08-29 13:38:10

标签: php state-machine

有人知道 PHP 中有后卫功能的finite state machine吗?

4 个答案:

答案 0 :(得分:5)

使用PEAR's FSMusage example),如果防护失败,您可以使用动作回调返回下一个状态,如下所示:

$payload = '';
$fsm = new FSM('STATE1', $payload);
function guard1($symbol, $payload) {
    if ($payload == 'something') {
        // Guard success, allow transition
        return;
    }
    else {
        // Guard fail, return to previous state
        return 'STATE1';
    }
}
$fsm->addTransition('SYMBOL1', 'STATE1', 'STATE2', 'guard1');

$fsm->process('SYMBOL1');

答案 1 :(得分:1)

查看ezComponents工作流程。允许您设计包含许多对象的工作流并添加条件和状态。

答案 2 :(得分:1)

退房: https://github.com/chriswoodford/techne/tree/v0.2

我认为它具有您正在寻找的功能。您可以定义转换,然后关联在处理转换之前调用的闭包。这是一个简单的例子:

定义您的FSM

  $machine = new StateMachine\FiniteStateMachine();
  $machine->setInitialState('off');

定义过渡

    $turnOff = new StateMachine\Transition('on', 'off');
    $turnOn = new StateMachine\Transition('off', 'on');

为turnOn过渡添加一个守卫

    // flipping the switch on requires electricity
    $hasElectricity = true;
    $turnOn->before(function() use ($hasElectricity) {
        return $hasElectricity ? true : false;
    });

从关闭转换为开启

  $machine->flip();  
  echo $machine->getCurrentState();
  // prints 'on'  

转换回关闭

  $machine->flip();  
  echo $machine->getCurrentState();
  // prints 'off'  

如果$ hasElectricity变量设置为false,结果将如下所示:

  // oops, forgot to pay that electricity bill
  $hasElectricity = false;

  $turnOn->before(function() use ($hasElectricity) {
      return $hasElectricity ? true : false;
  });

然后,如果您尝试从关闭转换 - >上

  $machine->flip();  
  echo $machine->getCurrentState();
  // prints 'off'  

为了确定过渡完成的位置,您只需将先前的状态与当前状态进行比较。

答案 3 :(得分:0)

Metabor Statemachine中的条件 https://github.com/Metabor/Statemachine 可以用作Guards(Transition构造函数中的第3个参数)。 见例子: https://github.com/Metabor/Statemachine-Example/blob/master/Example/Order/Process/Prepayment.php