unialteri/states

此软件包已被废弃且不再维护。作者建议使用 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 中创建遵循 状态模式 的类。这可以是一种更干净的方式来让对象在运行时改变其行为,而不需要使用大型单体条件语句,这有助于提高可维护性和编写工作流程。

功能

  • 创建多个状态:将类分成状态,以避免难以理解的大型单体语句。
  • 继承状态和类:通过继承,完整和简化状态。
    • 状态类也可以继承。
  • 自动切换状态:根据对象的属性定义状态切换规则。
  • 在任意位置实现:通过特性(traits)和接口,在现有代码中使用此模式。
    • 与 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或更高版本。某些更改可能导致向下兼容性中断

  • 构造函数属性提升
  • 非捕获捕获
  • 对数组函数进行了一些优化,以限制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"。
  • 清理死代码并简化库的行为。
  • 方法现在是绑定和由管理对象的状态执行,但结果注入到对象中。
  • 这种行为允许开发者为调用的方法执行多个实现(但只能注入一个结果)。
  • 从扩展teknoo/states-life-cyclable导入所有自动化功能。此实现也遵循#east编程。
  • teknoo/states-life-cyclable已弃用,并且从3.2版本开始与这个库不兼容。

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

  • teknoo/statesBundle已弃用,并且从3.1版本开始与这个库不兼容。

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

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

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

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

贡献:)

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