teknoo/states

用于在PHP中创建遵循状态模式的类的库。这可以是一种更清洁的方法,让对象在运行时更改其行为,而不必使用大型单体条件语句,从而提高可维护性和编写工作流程。

6.3.2 2024-08-27 10:06 UTC

README

Latest Stable Version Latest Unstable Version Total Downloads License PHPStan

States 允许您在PHP中创建遵循状态模式的类。这可以是一种更干净的方法,让对象在运行时更改其行为,而不必使用大型单体条件语句,从而提高可维护性和编写工作流程。

特性

  • 创建多个状态:将类拆分为状态,以避免难以理解的大型单体语句。
  • 继承状态和类:通过继承,完整和简化状态。
    • 状态类也可以继承。
  • 自动化状态切换:根据对象的属性定义状态切换规则。
  • 任何地方实现:借助特性和接口,在现有代码中使用此模式。
    • 与Doctrine兼容。

完整的文档可在文档/README.md中找到。

快速示例

<?php

declare(strict_types=1);

require 'vendor/autoload.php';

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('2022-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 2022
//Good morning, Richard
//Date: 07 01, 2022

完整示例

此库的使用示例位于文件夹中:演示

支持此项目

此项目是免费的,并将保持免费。它完全由EIRL的活动支持。如果您喜欢它并帮助我维护和改进它,请不要犹豫,在PatreonGithub上支持我。

谢谢 :) Richard。

鸣谢

EIRL Richard Déloge - https://deloge.io - 首席开发者。SASU Teknoo Software - https://teknoo.software

关于Teknoo Software

Teknoo Software是一家PHP软件编辑公司,由Richard Déloge创立,作为EIRL Richard Déloge的一部分。Teknoo Software的目标:为我们的合作伙伴和社区提供一套高质量的服务或软件,分享知识和技能。

许可

State采用MIT许可 - 请参阅许可证文件夹以获取详细信息。

安装 & 要求

要使用composer安装此库,请运行此命令

composer require teknoo/states

此库需要

* PHP 8.1+
* A PHP autoloader (Composer is recommended)
* Teknoo/Immutable (for Automated features).

完整的文档可在文档/README.md中找到。

来自Teknoo State 6.0的新闻

此库需要PHP 8.1或更高版本。一些更改会导致bc中断

  • StateInterface::VISIBILITY_*替换为同一命名空间中的Enum Visibility
  • 在不可变对象的类中使用只读行为。
  • 使用PropertyConstraintsSet防止自动化功能上的可变性错误。
  • ProxyInterface::DEFAULT_STATE_NAME现在是最终的

来自Teknoo State 5.0的新闻

此库需要PHP 8.0或更高版本。一些更改会导致bc中断

  • 构造函数属性提升
  • 非捕获捕获
  • 对数组函数进行优化,以限制O(n)

来自Teknoo State 4.0的新闻

此库需要PHP 7.4或更高版本。一些更改导致向后不兼容

  • PHP 7.4是最低要求
  • 大多数方法都已更新,包括适用的情况下的类型提示。请检查您的扩展点,以确保函数签名正确。_ 所有文件都使用严格类型。请确保不要依赖于类型强制。
  • 切换到类型属性
  • 移除一些无用的PHP DockBlocks
  • 用"..."运算符替换array_merge
  • 在QA工具中启用PHPStan并禁用PHPMd
  • 添加PHPStan扩展,专门用于支持Stated类分析和避免误报。

快速入门:实现您的第一个stated类

快速入门:学习如何使用此库:入门

3.x版本的演变

从版本3.2开始,内部API已重新设计为

  • 遵循#East编程规则。
  • 移除所有可以返回对象内部状态的公共"getter"。
  • 清理死代码并简化库的行为。
  • 方法由管理对象的state绑定并执行,但结果注入到对象中。
  • 此行为允许开发者为调用方法执行多个实现(但必须注入一个结果)。
  • 从扩展teknoo/states-life-cyclable导入所有自动功能。此实现也遵循#east编程。
  • teknoo/states-life-cyclable自3.2版本以来已弃用,且与此库不兼容。

从版本3.1开始,此库为teknoo/statesBundle提供基础实现。

  • teknoo/statesBundle自3.1版本以来已弃用,且与此库不兼容。

从版本3.0开始,此库已重新设计为

  • 现在,States的方法是闭包的构建器:它们必须返回一个闭包,可以与\Callable::call()绑定。Reflection API不再用于获取闭包。
  • 库使用\Callable::call()而不是\Callable::rebindTo(),更有效。
  • Stated类必须在代理类中通过静态方法statesListDeclaration()声明引用。
  • 工厂和加载器已移除,它们已经变得无用了。
  • 标准代理现在可以直接实例化。集成代理也已移除。

从版本2.0开始,此库已重新设计为

  • 重用所有Composer的自动加载功能,而不是内部自动加载器。
  • 减少此库内部功能所需的组件数量(依赖注入器、闭包注入器)。
  • 禁止使用像call_user_func这样的慢速函数。
  • 使用标量类型提示,以使用PHP引擎的检查而不是if语句。

贡献:)

欢迎您为此项目做出贡献。 在GitHub上Fork它