超级简单的状态机

资助包维护!
Github 赞助者

安装: 9

依赖: 0

建议者: 0

安全: 0

星标: 1

关注者: 1

分支: 0

开放问题: 0

类型:

2.0.2 2022-08-24 16:39 UTC

This package is auto-updated.

Last update: 2024-09-23 21:24:41 UTC


README

报告问题

请创建一个新的问题来报告错误或请求新功能。

安装

composer require aaronjunker/sssm

packagist 上查看包。

用法

1. 包含 SSSM

include_once "vendor/autoload.php";

use sssm\State;
use sssm\StateMachine;

2. 创建状态

语法

$stateName = new state($stateName, $canLoop);

两个参数都是可选的。但建议提供一个名称。

示例

// State 1 named "State 1" (can loop(default))
$state1 = new state("State 1");
// State 2 named "State 2" (can loop)
$state2 = new state("State 2");
// State 3 named "State 3" (loop not allowed)
$state3 = new state("State 3", false);

// Allowed transitions from state 1 to state 2 
$state1->addAllowedStateTransition($state2);
// Allowed transitions from state 2 to state 3
$state2->addAllowedStateTransition($state3);
// State 3 is not allowed to transition to any other state

3. 创建状态机

语法

$stateMachine = new stateMachine($initialState, $otherState, ...);

示例

$stateMachine = new stateMachine($state1, $state2, $state3);

4. 添加状态事件(可选)

语法

$stateName->onStateEnter[] = function(State $passedState) {
    // Things that get executed when entering the state
};

$stateName->onLoop[] = function(State $passedState){
    // Things that get executed when the state gets looped
};

$stateName->onStateLeave[] = function(State $passedState){
    // Things that get executed when leaving the state
};

示例

$state1->onStateEnter[] = $state1->onStateEnter[] = function($state){
    echo $state->getStateName()." entered\n";
};

$state1->onLoop[] = function(state $state){
    echo $state->getStateName()." looped\n";
};

$state1->onStateLeave[] = function(state $state){
    echo $state->getStateName()." leaved\n";
};

5. 循环状态

语法

$stateMachine->loop();

6. 切换状态

语法

$stateMachine->switchState($newState);

示例

$stateMachine->switchState($state2);
$stateMachine->switchState($state3);

7. 获取当前状态

语法

// Returns the current state class
$currentState = $stateMachine->getCurrentState();

示例

echo $stateMachine->getCurrentState() === $state3?"State 3 is current state":"State 3 is not current state";

完整示例

<?php

include_once "vendor/autoload.php";

use sssm\state;
use sssm\stateMachine;

$state1 = new state("State 1");
$state2 = new state("State 2");
$state3 = new state("State 3",false);

$state1->addAllowedStateTransition($state2);
$state2->addAllowedStateTransition($state3);

$stateMachine = new stateMachine($state1, $state2, $state3);

$state1->onStateEnter[] = $state2->onStateEnter[] = function($state){
    echo $state->getStateName()." entered\n";
};

$state1->onLoop[] = function(state $state){
    echo $state->getStateName()." looped\n";
};

$state1->onStateLeave[] = function(state $state){
    echo $state->getStateName()." leaved\n";
};


$stateMachine->loop();

$stateMachine->switchState($state2);
$stateMachine->switchState($state3);

echo $stateMachine->getCurrentState() === $state3?"State 3 is current state":"State 3 is not current state";