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é.
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.
Cloner le projet sur GitHub
Projet sous licence open source! Hébergé, développé et maintenu sur GitHub.
Voir le projet sur GitHub
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