teknoo / states
用于在PHP中创建遵循状态模式的类的库。这可以是一种更清洁的方法,让对象在运行时更改其行为,而不必使用大型单体条件语句,从而提高可维护性和编写工作流程。
Requires
- php: ^8.2
- teknoo/immutable: ^3.0.17
Requires (Dev)
- doctrine/mongodb-odm: ^2.6.2
- doctrine/orm: ^2.17.2||^3
- nikic/php-parser: ^4.19.1
- phpstan/phpstan: ^1.12
- phpunit/phpunit: ^10.5.28|^11
- roave/security-advisories: dev-latest
- squizlabs/php_codesniffer: ^3.10
- symfony/property-access: ^6.3||^7.0
- dev-master
- 6.3.2
- 6.3.1
- 6.3.0
- 6.2.0
- 6.2.0-beta1
- 6.1.7
- 6.1.6
- 6.1.5
- 6.1.4
- 6.1.3
- 6.1.2
- 6.1.1
- 6.1.0
- 6.0.19
- 6.0.18
- 6.0.17
- 6.0.16
- 6.0.15
- 6.0.14
- 6.0.13
- 6.0.12
- 6.0.11
- 6.0.10
- 6.0.9
- 6.0.8
- 6.0.7
- 6.0.6
- 6.0.5
- 6.0.4
- 6.0.3
- 6.0.2
- 6.0.1
- 6.0.0
- 5.1.9
- 5.1.8
- 5.1.7
- 5.1.6
- 5.1.5
- 5.1.4
- 5.1.3
- 5.1.2
- 5.1.1
- 5.1.0
- 5.0.6
- 5.0.5
- 5.0.4
- 5.0.3
- 5.0.2
- 5.0.1
- 5.0.0
- 4.1.9
- 4.1.8
- 4.1.7
- 4.1.6
- 4.1.5
- 4.1.4
- 4.1.3
- 4.1.2
- 4.1.1
- 4.1.0
- 4.0.15
- 4.0.14
- 4.0.13
- 4.0.12
- 4.0.11
- 4.0.10
- 4.0.9
- 4.0.8
- 4.0.7
- 4.0.6
- 4.0.5
- 4.0.4
- 4.0.3
- 4.0.2
- 4.0.1
- 4.0.0
- 4.0.0-beta7
- 4.0.0-beta6
- 4.0.0-beta5
- 4.0.0-beta4
- 4.0.0-beta3
- 4.0.0-beta2
- 4.0.0-beta1
- 3.3.7
- 3.3.6
- 3.3.5
- 3.3.4
- 3.3.3
- 3.3.2
- 3.3.1
- 3.3.0
- 3.2.2
- 3.2.1
- 3.2.0
- 3.2.0-beta6
- 3.2.0-beta5
- 3.2.0-beta4
- 3.2.0-beta3
- 3.2.0-beta2
- 3.2.0-beta1
- 3.1.0
- 3.1.0-rc1
- 3.1.0-beta3
- 3.1.0-beta2
- 3.1.0-beta1
- 3.0.1
- 3.0.0
- 3.0.0-beta1
- 3.0.0-alpha4
- 3.0.0-alpha3
- 3.0.0-alpha2
- 3.0.0-alpha1
- 2.1.1
- 2.1.0
- 2.0.6
- 2.0.5
- 2.0.4
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- 2.0.0-rc5
- 2.0.0-rc4
- 2.0.0-rc3
- 2.0.0-rc2
- 2.0.0-rc1
- 2.0.0-beta18
- 2.0.0-beta17
- 2.0.0-beta16
- 2.0.0-beta15
- 2.0.0-beta14
- 2.0.0-beta13
- 2.0.0-beta12
- 2.0.0-beta11
- 2.0.0-beta10
- 2.0.0-beta9
- 2.0.0-beta8
- 2.0.0-beta7
- 2.0.0-beta6
- 2.0.0-beta5
- 2.0.0-beta4
- 2.0.0-beta3
- 2.0.0-beta2
- 1.2.3
- 1.2.2
- 1.2.1
- 1.2.0
- 1.2.0-rc6
- 1.2.0-rc5
- 1.2.0-rc4
- 1.2.0-rc3
- 1.2.0-rc2
- 1.2.0-rc1
- 1.2.0-beta7
- 1.2.0-beta6
- 1.2.0-beta5
- 1.2.0-beta4
- 1.2.0-beta3
- 1.2.0-beta2
- 1.2.0-beta1
- 1.1.2
- 1.1.1
- 1.1.0
- 1.0.3
- 1.0.2
- 1.0.1
- 1.0.0
- 0.9.1-RC
- dev-dev-legacy
This package is auto-updated.
Last update: 2024-09-22 10:17:36 UTC
README
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的活动支持。如果您喜欢它并帮助我维护和改进它,请不要犹豫,在Patreon或Github上支持我。
谢谢 :) 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
。 - 在不可变对象的类中使用只读行为。
- 使用
Property
和ConstraintsSet
防止自动化功能上的可变性错误。 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它