Skip to content

Aaron-Junker/sssm

Folders and files

NameName
Last commit message
Last commit date

Latest commit

0040b5e · Aug 26, 2022

History

26 Commits
Aug 26, 2022
Aug 24, 2022
Aug 24, 2022
Aug 24, 2022
Aug 18, 2022
Aug 24, 2022
Aug 24, 2022
Aug 24, 2022
Aug 24, 2022
Aug 24, 2022
Aug 24, 2022
Aug 24, 2022
Aug 24, 2022
Aug 26, 2022

Repository files navigation

SSSM - Super simple state machine for PHP

Report issues

Please open a new issue to report a bug or request a new feature.

Installation

composer require aaronjunker/sssm

View package on packagist.

Usage

1. Include SSSM

include_once "vendor/autoload.php";

use sssm\State;
use sssm\StateMachine;

2. Create the states

Syntax:

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

Both arguments are optional. But a name is highly recommended.

Example:

// 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. Create the state machine

Syntax:

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

Example:

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

4. Add state events (optional)

Syntax:

$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
};

Example:

$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. Loop state

Syntax:

$stateMachine->loop();

6. Switch state

Syntax:

$stateMachine->switchState($newState);

Example:

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

7. Get current state

Syntax:

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

Example:

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

Full example

<?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";