UML class diagram

States

Apporter le pattern State à vos projets.


Pour créer des classes implémentant le pattern "State" en PHP. Une méthode efficace pour permettre à un objet de changer de comportement sans avoir recours à de nombreuses instructions conditionnelles..

Le patron état est un modèle de conception logiciel comportemental qui implémente une machine à états de manière orientée objet. Avec le patron état, une classe à états est implémentée en implémentant chaque état individuel en tant que classe dérivée de l'interface de modèle d'état et en implémentant des transitions d'état en appelant des méthodes définies par la superclasse (ou proxy) du patron.

Le patron état peut être interprété comme un patron de stratégie capable de changer la stratégie actuelle via des invocations de méthodes définies dans l'interface du patron.

Ce patron est utilisé en programmation informatique pour encapsuler différents comportements du même objet en fonction de son état interne. Cela peut être un moyen plus propre pour un objet de modifier son comportement au moment de l'exécution sans recourir à de grandes instructions conditionnelles monolithiques, ce qui améliore la maintenabilité.

https://en.wikipedia.org/wiki/State_pattern

UML Sequence Diagram

Fonctionnalités


Création d'états

Organiser vos classes en différents états afin d'éviter de trop nombreuses instructions conditionnelles.

Héritage d'états et de classes

Compléter et factoriser vos états grâce à l'héritage. Les états peuvent aussi être hérités.

Automisation des changements d'états

Définir les règles permettant le changement automatique dans un état pré-défini.

Utilisable partout

Grâce aux traits et interfaces, implémenter ce pattern sur vos codes existants. Compatible avec Doctrine et PHPStan.

GitHub


Cloner le projet sur GitHub

Projet sous licence open source! Hébergé, développé et maintenu sur GitHub.


Voir le projet sur GitHub

Patreon


Supporter le projet sur Patreon

Ce projet est logiciel libre et le restera, mais son développement a un coût. Si vous l'appréciez et si vous souhaitez nous aider à le maintenir et à le faire évoluer. N'hésitez pas à nous supporter sur Patreon.


Supporter le p[rojet

Exemple



<?php

declare(strict_types=1);

namespace
Acme;

require_once
'vendor/autoload.php';

use
Closure;
use
DateTime;
use
Teknoo\States\Automated\AutomatedInterface;
use
Teknoo\States\Automated\AutomatedTrait;
use
Teknoo\States\Automated\Assertion\Property;
use
Teknoo\States\Automated\Assertion\Property\IsEqual;
use
Teknoo\States\Proxy\ProxyInterface;
use
Teknoo\States\Proxy\ProxyTrait;
use
Teknoo\States\State\AbstractState;

class
English extends AbstractState
{
public function
sayHello(): Closure
{
return function():
string {
return
'Good morning, '.$this->name;
};
}

public function
displayDate(): Closure
{
return function(
DateTime $now): string {
return
$now->format('m d, Y');
};
}
}

class
French extends AbstractState
{
public function
sayHello(): Closure
{
return function():
string {
return
'Bonjour, '.$this->name;
};
}

public function
displayDate(): Closure
{
return function(
DateTime $now): string {
return
$now->format('d m Y');
};
}
}

class
Person implements ProxyInterface, AutomatedInterface
{
use
ProxyTrait;
use
AutomatedTrait;

private
string $name;

private
string $country;

public function
__construct()
{
$this->initializeStateProxy();
}

protected static function
statesListDeclaration(): array
{
return [
English::class,
French::class
];
}

protected function
listAssertions(): array
{
return [
(new
Property([English::class]))
->
with('country', new IsEqual('en')),
(new
Property([French::class]))
->
with('country', new IsEqual('fr')),
];
}

public function
setName(string $name): Person
{
$this->name = $name;

return
$this;
}

public function
setCountry(string $country): Person
{
$this->country = $country;
$this->updateStates();

return
$this;
}
}

$frenchMan = new Person();
$frenchMan->setCountry('fr');
$frenchMan->setName('Roger');

$englishMan = new Person();
$englishMan->setCountry('en');
$englishMan->setName('Richard');

$now = new DateTime('2016-07-01');

foreach ([
$frenchMan, $englishMan] as $man) {
echo
$man->sayHello().PHP_EOL;
echo
'Date: '.$man->displayDate($now).PHP_EOL;
}

//Display
//Bonjour, Roger
//Date: 01 07 2016
//Good morning, Richard
//Date: 07 01, 2016