aaronjunker / sssm
超级简单的状态机
2.0.2
2022-08-24 16:39 UTC
Requires
- php: >=8.0.0
Requires (Dev)
- phpunit/phpunit: 9.5
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";